2017-10-17 54 views
0

我目前正在嘗試獲取與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

回答

1

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

相關問題