2017-10-17 14 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) 

私が得ることができますフォームをレンダリングしてページに表示しますが、すでに存在するデータが表示されるようにするには、フィールドが空であるため、何か間違ったことをしています。

もう1つの複雑さは、このフォームがnamedescriptionのモデルのamountフィールドを編集してはならないということです。 amountの値は、このページの詳細ビューとは別に編集されます。

私の主な質問は、すでに存在するモデルフィールドのデータを取り込むフォームを取得してから編集する方法です。 Djangoが提供する汎用のUpdateViewのような機能が理想的です。

私はこれですべてのヘルプははるかにお時間を

おかげでいただければ幸い1.10

Djangoのバージョンを使用しています

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'を上書きしないでください。ベースビューとミックスインはそれをあなたのために定義します。 –

+0

私はDjangoのドキュメントからこの例を採用しています。「ViewMixinを使用して、両方のビューが実装するため、DetailViewとFormView(これは適切なpost()を提供しています)だから、私はそれがおそらく最良の方法ではないことに同意する – 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'を基に作成されているので、同じ方法でテンプレートのオブジェクトにアクセスすることができます。私がちょうど思い出した1つの微妙な点は、フォーム検証によってオブジェクトが変更されるということです。フォームが無効なときに混乱を避けるために、データベースから再度フェッチすることをお勧めします。 – Alasdair

関連する問題