9

Djangoクラスベースのビューで2つのフォームを処理しようとしています。このサイトには、ListViewのリスト結果を絞り込むためのform(に基づく)というフォームと、(に基づく)2番目のフォームが含まれています。GETstatus_formPOST

ListViewはアイテムのリストを返すため、両方のフォームが必要です。Formユーザーが選択肢を制限しstatus_forms、モーダルフォームを介して誤ったアイテムにフラグを立てることができます(したがって、同じテンプレート内にある必要があります)。

私の問題は、メソッドが付属していListViewないことですが、付属しています。私のクラスは両方のクラスを継承していますが、クラスを実行するとエラーメッセージが表示されます。postFormViewList

属性エラー:「リスト」オブジェクトに属性「status_form」がありません

2番目のフォームが?を介して処理できるように実装を変更するにはどうすればよいpost methodですか?

class List(PaginationMixin, ListView, FormMixin):
    model = ListModel
    context_object_name = 'list_objects'
    template_name = 'pages/list.html'
    paginate_by = 10 #how may items per page

    def get(self, request, *args, **kwargs):
        self.form = ListSearchForm(self.request.GET or None,)
        return super(List, self).get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.status_form = StatusForm(self.request.POST or None)
        if self.status_form.is_valid():
            ...
        else:
            return super(List, self).post(request, *args, **kwargs)

    def get_queryset(self):
        # define the queryset
        ...
        # when done, pass to object_list
        return object_list

    def get_context_data(self, **kwargs):
        context = super(List, self).get_context_data(**kwargs)
        context.update(**kwargs)
        context['form'] = self.form
        context['status_form'] = self.status_form # Django is complaining that status_form is not existing, result since the post method is not executed
        return context
4

1 に答える 1

7
# Django is complaining that status_form does not exist,
# result since the post method is not executed
context['status_form'] = self.status_form

そもそも定義しなかったからですself.status_from。で定義しget_context_data、そこからアクセスできます。

get_context_datapostメソッドからオブジェクトにアクセスできます。

context = self.get_context_data(**kwargs)
status_form = context['status_form']

また、またはから取得せずにstatus_form、メソッド自体で直接定義できることも考慮してください。postselfget_context_data

ビューを再設計して、各フォーム処理を別々のビューに分けてから、それらを互いに緊密にします。

ビューの再設計:

一言で言えば、各ビューに1つのジョブを実行させます。を処理するためだけにビューを作成し、次のstatus_formように名前を付けてStatusFormProcessView、ビューでそのメソッドListに返すことができます。post

class List(ListView);
    def post(self, request, *args, **kwargs):
        return StatusFormView.as_view()(request) # What ever you need be pass to you form processing view

これはほんの一例であり、現実になるにはさらに多くの作業が必要です。

別の例として; 私のウェブサイトのインデックスページに検索フォームがあります。ユーザーPOSTまたはGET検索フォームの場合、検索の処理は私の中に存在しませんIndexView。代わりに、フォーム全体を別のビューで処理します。フォームがメソッドで処理される場合は、メソッドGETをオーバーライドします。get()フォームが処理される場合はPOST、I 'post()メソッドをオーバーライドsearch_formして、処理の処理を担当するビューにデータを送信しますsearch_form

コメント応答

status_form = context['status_form']

あるべきではない

context['status_form'] = status_form

作成した後?

あなたはから取得status_formしたいcontextので、あなたはする必要があります

status_form = context['status_form']

とにかく、あなたのフォームデータはで利用可能ですself.request.POST

于 2013-03-25T18:49:07.847 に答える