Django:使用post()方法的ListView?

neu*_*rix 6 python django formview django-class-based-views class-based-views

我试图在基于Django类的视图中处理两个表单.该站点包含一个名为form(基于GET)的表单,用于缩小ListView和第二个表单status_form(基于POST)的列表结果.

两个表单都是必需的,因为ListView返回一个项列表.Form让用户限制选择并status_forms让用户通过模态表单标记不正确的项目(因此它需要在同一模板中).

我的麻烦是,ListView方法没有post,但是FormView.我的类List继承自这两个类,但是当我执行该类时,我收到错误消息:

属性错误:'List'对象没有属性'status_form'

我该如何更改我的实现以允许通过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
Run Code Online (Sandbox Code Playgroud)

Ali*_*and 7

# Django is complaining that status_form does not exist,
# result since the post method is not executed
context['status_form'] = self.status_form
Run Code Online (Sandbox Code Playgroud)

因为你没有self.status_from首先定义.你已经定义了它get_context_data,并且可以从那里访问它.

您可以get_context_data在post方法中访问您的对象;

context = self.get_context_data(**kwargs)
status_form = context['status_form']
Run Code Online (Sandbox Code Playgroud)

另外请考虑您可以status_form直接在post方法中定义您的方法,而无需从中获取selfget_context_data.

重新设计您的视图以在单独的视图中分隔每个表单处理,然后将它们彼此紧密.

视图重新设计:

简而言之,让每个视图完成一项工作.您可以创建一个视图,仅用于处理您的视图,然后在视图中将其status_form命名为返回其方法StatusFormProcessViewListpost

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
Run Code Online (Sandbox Code Playgroud)

这只是一个例子,需要更多的工作才能真实.

再举一个例子; 在我的网站索引页面上,我有一个搜索表单.当用户POSTGET搜索表单时,我的搜索处理不存在IndexView,而是我在单独的视图中处理整个表单的东西,如果表单应该在GET方法上处理,我将覆盖get()方法,如果表格应该处理POST,我' ll override post()方法将search_form数据发送到负责处理的视图search_form.

评论回复

status_form = context['status_form']

不应该

context['status_form'] = status_form
Run Code Online (Sandbox Code Playgroud)

我创造它之后?

你想status_formcontext,所以你需要

status_form = context['status_form']
Run Code Online (Sandbox Code Playgroud)

无论如何,您的表单数据可用 self.request.POST