我试图在基于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
因为你一开始没有定义
self.status_from
。 您已经在get_context_data
中定义了它,并且可以从那里访问它。您可以从post方法中的
get_context_data
访问对象还可以考虑在
post
方法本身中直接定义status_form
,而不必从self
或get_context_data
获取它。重新设计视图以将每个表单处理分离到不同的视图中,然后将它们彼此紧密地结合在一起。
视图重新设计:
简而言之,让每个视图做一项工作。您可以创建一个视图来处理您的
status_form
,并将其命名为StatusFormProcessView
,然后在List
视图上返回它的post
方法这只是一个例子,需要更多的工作来实现。
例如,在我的网站索引页上,我有一个搜索表单。当用户
POST
或GET
搜索表单时,搜索处理不存在于我的IndexView
中,而是在单独的视图中处理整个表单内容,如果表单应在GET
方法上处理,则重写get()
方法,如果表单应在POST
上处理,则重写post()
方法以将search_form
数据发送到负责处理search_form
。评论回复
status_form = context['status_form']
不是吗
在我创造它之后?
你想从
context
得到status_form
,所以你需要无论如何,您的表单数据在
self.request.POST
上可用相关问题 更多 >
编程相关推荐