2017-11-01 13 views
0

Djangoページを作成しようとしています。何かを更新したり、ページテーブルで何かを見ることができます。同じテンプレートページにページビューのListViewとUpdateViewを表示

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

    def get_absolute_url(self): 
     return reverse(
      'costgroup_detail', 
      kwargs={ 
       'costgroup_pk': self.pk, 
      } 
     ) 


class Cost(models.Model): 
    cost_group = models.ForeignKey(CostGroup) 
    amount = models.DecimalField(max_digits=50, decimal_places=2) 

    def get_absolute_url(self): 
     return reverse(
      'cost_detail', 
      kwargs={ 
       'cost_pk': self.pk, 
      } 
     ) 

だから、編集フォームがCostGroupモデルのnamedescriptionフィールド用で、テーブルが、私は以前にそれがで働いていた「amounts`

の一覧を表示する必要があります:モデルは次のようになりますフォーム用のUpdateViewと、フォームテンプレートに含まれているテーブルだけです。しかし、テーブルにページネーションを含めるには、同じページで2つのビューを使用する必要があります。私がデザインしたページが最後に次のようになります。

Wireframe for Django page

私は現時点では私の主な焦点は、フォームと同じページにテーブルを取得している時点でのスタイリングを心配していないです。現在の状態では、私が持っていない唯一のことは、テーブルの改ページです:

ビューは現在、次のようになります。

class CostDetail(UpdateView): 
    model = models.Cost 
    pk_url_kwarg = 'cost_pk' 
    template_name = 'main/cost_detail.html' 
    form_class = forms.CostDetailEditForm 
    success_url = reverse_lazy('cost_list') 

私はDjangoの基礎となるミックスインを活用するという感覚を持っていますCBVの使用はおそらく行く方法ですが、私はこれで始める方法がわかりません。

すべてのヘルプははるかに私が働いているアプリは今、同様のアプローチを使用して、あなたの時間を

おかげ

答えて

1

(この明確化は、新しい答えとしてうまく機能するように見えた)

あなたがテーブルの両方を扱っているように見えます。オブジェクト・レベルはCostGroupを使用していますが、リスト・ビューはCostGroupにリンクされたCostの子レコードを表示しています。それが真であると仮定すると、ここで私が進行する方法は次のとおりです。

class CostDetail(ModelFormMixin, ListView): 

    model = CostGroup # Using the model of the record to be updated 
    form_class = YourFormName # If this isn't declared, get_form_class() will 
           # generate a model form 


    ordering = ['id'] 
    paginate_by = 10 
    template_name = 'main/cost_detail.html' # Must be declared 

    def get_queryset(self): 
     # Set the queryset to use the Cost objects that match the selected CostGroup 
     self.queryset = Cost.objects.filter(cost_group = get_object()) 
     # Use super to add the ordering needed for pagination 
     return super(CostDetail,self).get_queryset() 

    # We want to override get_object to avoid using the redefined get_queryset above 
    def get_object(self,queryset=None): 
     queryset = CostGroup.objects.all() 
     return super(CostDetail,self).get_object(queryset)) 

    # Include the setting of self.object in get() 
    def get(self, request, *args, **kwargs): 

     # from BaseUpdateView 
     self.object = self.get_object() 

     return super(CostDetail,self).get(request, *args, **kwargs) 

    # Include the contexts from both 
    def get_context_data(self, **kwargs): 

     context = ModelFormMixin.get_context_data(**kwargs) 
     context = ListView.get_context_data(**context) 
     return context 

    # This is the post method found in the Update View 
    def post(self, request, *args, **kwargs): 

     # From BaseUpdateView 
     self.object = self.get_object() 

     # From ProcessFormView 
     form = self.get_form() 
     self.form = form 
     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

    def put(self, *args, **kwargs): 
     return self.post(*args, **kwargs) 

私はこれを実行しようとしていないので、エラーがあるかもしれません。がんばろう!

(クラスベースのビューを参照すると、ccbv.co.ukはあなたの友人です)

+0

それをクリアしてくれてありがとう!いくつかの調整を加えて動作させるように管理されています。あなたの助けをありがとう – BeeNag

+0

@BeeNagあなたはそれが動作させるために必要な調整を投稿してもよろしいですか? – hlongmore

+1

@hlongmore私がこれを覚えていることから、私が使用していたコードは変更されました。私はDashdrumの答えを跳躍のポイントとして使用しましたが、最終的に私は元のビューを使っていました。get_queryset 、get_context_dataとget_form(私は頭の上からどれが覚えていないかはフォームメソッドの1つでした)。私はその後、ビューからform_classを削除しました。両方のインスタンスで同じクエリーセットからデータが取得されたので、必要なデータとテーブルの両方をフォームに取り込むのは比較的簡単でした。私はそれが理にかなったことを願う – BeeNag

0

をいただければ幸いです。 ListViewからFormMixinを読み込み、FormViewからpost()を呼び出します。

class LinkListView(FormMixin, ListView): 
    model = Link 
    ordering = ['-created_on'] 
    paginate_by = 10 
    template_name = 'links/link_list.html' 

    form_class = OtherUserInputForm 

    #=============================================================================# 
    # 
    #  Handle form input 
    # 

    def post(self, request, *args, **kwargs): 
     """ 
     Handles POST requests, instantiating a form instance with the passed 
     POST variables and then checked for validity. 
     """ 
     form = self.get_form() 
     self.form = form 
     if form.is_valid(): 
      return self.form_valid(form) 
     else: 
      return self.form_invalid(form) 

    def put(self, *args, **kwargs): 
     return self.post(*args, **kwargs) 

    def get_success_url(self): 
     return reverse('links') 

またget_object()get_queryset()、およびget_context()を無効にしたい場合があります。

+0

ありがとうございます。私は上書きについて本当にわからない。現時点では、ページはデータなしでレンダリングされているので、明らかに私はそれらを必要としますが、このコンテキストでどのように使用されるかはわかりません。私は実際にget_context_data()を使用しています。あなたはあなたの提案を精緻化することができますか? – BeeNag

関連する問題