在同一页上有编辑表单和详细视图

问题描述:

我目前正在尝试获取与Django中的详细视图在同一页面上工作的编辑表单。在同一页上有编辑表单和详细视图

我目前正在按照文档上推荐的方式尝试使用方法(即使用FormMixin)。所以,我的看法是这样的:

class ProductiveMinutesDetail(FormMixin, DetailView): 
    model = models.ProductiveMinutes 
    pk_url_kwarg = 'productiveminutes_pk' 
    form_class = forms.EditForm 

    def get_success_url(self): 
     return reverse_lazy('productiveminutes_list') 

    def get_context_data(self, **kwargs): 
     context = super(ProductiveMinutesDetail, self).get_context_data(**kwargs) 
     context['form'] = forms.EditForm(initial={'post': self.object}) 
     return context 

    def post(self, request, *args, **kwargs): 
     self.object = self.get_object() 
     form = self.get_form() 
     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

    def form_valid(self, form): 
     form.save() 
     return super(ProductiveMinutesDetail, self).form_valid(form) 

我的形式如下:

from django import forms 
from . import models 

class EditForm(forms.ModelForm): 
    class Meta: 
     model = models.ProductiveMinutes 
     fields = ('name', 'description',) 

我使用的模式是这样的:

class Scenario(models.Model): 
    name = models.CharField(max_length=200) 

class ProductiveMinutes(models.Model): 
    scenario = models.OneToOneField(Scenario) 
    name = models.CharField(max_length=200) 
    amount = models.DecimalField(max_digits=50, decimal_places=2) 
    description = models.CharField(max_length=200) 

使用这个我可以得到窗体在页面上呈现,但我知道我做错了,因为这些字段是空的,我希望它们填充已存在的数据。

另一个复杂性是,此表单不应该编辑模型的amount字段,只需编辑namedescription即可。 amount值与此页面的详细视图分开编辑。

所以,我想我的主要问题是我怎样才能得到的表单填充模型字段的数据已经存在,然后编辑它。理想的功能类似于Django提供的通用UpdateView

我使用Django版本1.10

任何帮助,这将是非常赞赏

感谢您的时间

UPDATE:

我的模板看起来是这样的:

{% extends 'pages/dashboard.html' %} 
{% load i18n humanize crispy_forms_tags %} 

{% block content %} 
    <div> 
     <h1 class="text-center">Productive Minutes: {{ productiveminutes.name }}</h1> 
     <div class="row"> 
      <div class="col"></div> 
      <div class="col-md-8 col-lg-8"> 
       <h3>Edit productive minutes: {{ productiveminutes.name }}</h3> 
       <form role="form" method="post"> 
        {% csrf_token %} 
        {{ form|crispy }} 
        <button class="primaryAction btn btn-primary pull-right" type="submit">{% trans "Submit" %}</button> 
       </form> 
      </div> 
      <div class="col"></div> 
     </div> 
     <hr> 
     <div class="row"> 
      <div class="col"></div> 
      <div class="col-md-8 col-lg-8"> 
       <h3>Data Records</h3> 
       <div class="table-responsive"> 
        <table class="table table-bordered"> 
         <thead class="thead-default"> 
          <tr> 
           <th>ID</th> 
           <th>Productive Minutes</th> 
           <th>Action</th> 
          </tr> 
         </thead> 
         <tbody> 
          <tr> 
           <td>{{ productiveminutes.id }}</td> 
           <td>{{ productiveminutes.amount|intcomma }}</td> 
           <td> 
            <a href="#"><i class="fa fa-pencil"></i></a> 
            <a href="#"><i class="fa fa-trash"></i></a> 
           </td> 
          </tr> 
         </tbody> 
        </table> 
       </div> 
      </div> 
      <div class="col"></div> 
     </div> 
    </div> 
{% endblock content %} 
+0

你不应该重写'post';基本视图和mixin为你定义。 –

+0

当我调整Django文档中的示例时,他们说:“我们使用FormMixin并自己实现post(),而不是尝试将DetailView与FormView混合(它提供了合适的post()),因为这两个视图都实现了get (),事情会变得更加混乱。“所以,是的,我同意它可能不是最好的方式来做它 – BeeNag

example in the docs用于显示对一个物体的细节和一个单独的联系表格。

在你的情况下,它听起来像你想显示ProductiveMinutesDetail对象,并有一个表格,允许你更新同一个对象的一些字段。在这种情况下,您应该只使用UpdateView

class ProductiveMinutesUpdate(UpdateView): 
    model = models.ProductiveMinutes 
    pk_url_kwarg = 'productiveminutes_pk' 
    form_class = forms.EditForm 

    success_url = reverse('productiveminutes_list') 

    def get_context_data(self, **kwargs): 
     context = super(ProductiveMinutesUpdate, self).get_context_data(**kwargs) 
     # Refresh the object from the database in case the form validation changed it 
     object = self.get_object() 
     context['object'] = context['productiveminutes'] = object 
     return context 
+0

我可以在同一页上显示'UpdateView'和'DetailView'虽然吗?我需要能够在同一页面上显示此更新表单和金额字段的值,可以在我当前的模板中看到。 – BeeNag

+0

不用担心我现在有工作,只需传递模板名称以及显示我需要的细节!感谢您指引我朝着正确的方向 – BeeNag

+0

更新视图与'DetailView'具有相同的'SingleObjectMixin',因此您可以用相同的方式访问模板中的对象。我刚才记住的一个微妙之处是表单验证会改变对象,所以从表单中重新获取它以避免表单无效时的混淆是一个好主意。 – Alasdair