Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:ListView与post()方法?_Python_Django_Formview_Django Class Based Views - Fatal编程技术网

Python Django:ListView与post()方法?

Python Django:ListView与post()方法?,python,django,formview,django-class-based-views,Python,Django,Formview,Django Class Based Views,我试图在基于Django类的视图中处理两个表单。该站点包含一个名为form(基于GET)的表单,用于缩小列表视图的列表结果,第二个表单是status\u表单(基于POST) 这两种表单都是必需的,因为ListView返回项目列表Form允许用户限制选择,而status\u forms允许用户通过模式表单标记不正确的项目(因此需要在同一模板中) 我的问题是,ListView没有方法post,但是FormView有。我的类List继承自这两个类,但当我执行该类时,会收到错误消息: 属性错误:“列表”

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

这两种表单都是必需的,因为ListView返回项目列表
Form
允许用户限制选择,而
status\u forms
允许用户通过模式表单标记不正确的项目(因此需要在同一模板中)

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

属性错误:“列表”对象没有属性“状态表单”

如何更改实现以允许通过
post方法处理第二个表单?

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
因为你没有首先从
中定义自我状态。 您已经在
get\u context\u data
中定义了它,可以从那里访问它

您可以通过post方法中的
get\u context\u data
访问对象

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

也可以考虑在<代码> POST <代码>方法中直接定义您的<代码> StasuSyFrase<代码>,而不从<代码>自身< /代码>或<代码> GETY-COXTXEDATA < /COD>

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

视图重新设计:

简而言之,让每个视图执行一项任务。您可以创建一个视图,仅用于处理您的
状态\u表单
,并将其命名为
StatusFormProcessView
,然后在
列表
视图的
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
上处理,我将重写
post()
方法,将
search\u表单
数据发送到负责处理
search\u表单
的视图

评论和回应
status\u form=context['status\u form']

难道不是吗

context['status_form'] = status_form
在我创建它之后

您想从
上下文中获取
状态\u表单
,因此需要

status_form = context['status_form']

不管怎样,您的表单数据可以在
self.request.POST

上找到,您能解释一下重新设计视图的含义吗?我对行status\u form=context['status\u form']感到困惑,在我创建它之后,它不应该是context['status\u form']=status\u form吗?谢谢您的建议。当执行您建议的操作并转到返回状态窗体视图时,as_视图(请求)
我得到
TypeError:as_视图()接受1个位置参数,但给出了2个位置参数
。我不知道该怎么办2分钟后。。。该行应该是:
returnstatusformview.as_view()(request)
@PhilGyford感谢建议的修复。我已经用你的建议更新了答案。
status_form = context['status_form']