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)
# 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方法中定义您的方法,而无需从中获取self或get_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)
这只是一个例子,需要更多的工作才能真实.
再举一个例子; 在我的网站索引页面上,我有一个搜索表单.当用户POST或GET搜索表单时,我的搜索处理不存在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_form从context,所以你需要
status_form = context['status_form']
Run Code Online (Sandbox Code Playgroud)
无论如何,您的表单数据可用 self.request.POST