Django:ListView和post()方法?

2024-04-25 04:50:04 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我的问题是,方法ListView没有附带post,但是FormView有。我的类List继承自两个类,但是当我执行该类时,会收到错误消息:

Attribute Error: 'List' object has no attribute '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

Tags: selfform表单getreturnobjectrequestdef
3条回答
# 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中定义了它,并且可以从那里访问它。

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

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

还可以考虑在post方法本身中直接定义status_form,而不必从selfget_context_data获取它。

重新设计视图以将每个表单处理分离到不同的视图中,然后将它们彼此紧密地结合在一起。

视图重新设计:

简而言之,让每个视图做一项工作。您可以创建一个视图来处理您的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

这只是一个例子,需要更多的工作来实现。

例如,在我的网站索引页上,我有一个搜索表单。当用户POSTGET搜索表单时,搜索处理不存在于我的IndexView中,而是在单独的视图中处理整个表单内容,如果表单应在GET方法上处理,则重写get()方法,如果表单应在POST上处理,则重写post()方法以将search_form数据发送到负责处理search_form

评论回复

status_form = context['status_form']

不是吗

context['status_form'] = status_form

在我创造它之后?

你想从context得到status_form,所以你需要

status_form = context['status_form']

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

相关问题 更多 >