Django-与Mixin组合的FormView
我必须指定一个Django-与Mixin组合的FormView,django,django-forms,mixins,django-class-based-views,class-based-views,Django,Django Forms,Mixins,Django Class Based Views,Class Based Views,我必须指定一个success\u url,否则会出现错误。那么如何指定它,以便保持在同一页上呢? 另外,关于SearchView的其他内容是否正确,因为我感觉缺少了一些东西。我的上下文应该由表单,查询,概念,语言和语言组成。 谢谢 url.py url(r'^(?P<langcode>[a-zA-Z-]+)/search/$', SearchView.as_view(), name='search'). class _LanguageMixin(object): def
success\u url
,否则会出现错误。那么如何指定它,以便保持在同一页上呢?
另外,关于SearchView的其他内容是否正确,因为我感觉缺少了一些东西。我的上下文应该由表单
,查询
,概念
,语言
和语言
组成。
谢谢
url.py
url(r'^(?P<langcode>[a-zA-Z-]+)/search/$', SearchView.as_view(), name='search').
class _LanguageMixin(object):
def dispatch(self, request, *args, **kwargs):
self.langcode = kwargs.pop("langcode")
self.language = get_object_or_404(Language, pk=self.langcode)
return super(_LanguageMixin, self).dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(_LanguageMixin, self).get_context_data(**kwargs)
context.update({"language": self.language,
"languages": Language.objects.values_list('code',
flat=True)})
return context
class SearchView(_LanguageMixin, FormView):
template_name = "search.html"
form_class = SearchForm
success_url = #......
query = ''
concepts = []
def get_initial(self):
return {'langcode': self.langcode}
def get_context_data(self, **kwargs):
context = super(SearchView, self).get_context_data(**kwargs)
context.update({"query": self.query, "concepts": self.concepts})
return context
def form_valid(self, form):
self.query = form.cleaned_data['query']
self.concepts = # here is a long DB query; function(query)
return super(SearchView, self).form_valid(form)
[编辑]
我这样做:
def get_success_url(self):
return reverse('search', kwargs={'langcode': self.langcode})+"?query={}".format(self.query)
表单呈现,但每当我搜索任何内容时,都会返回空的搜索文本字段。URL看起来像这样:
http://localhost:8000/en-US/search/?query=asd
默认情况下,FormView
(实际上,ProcessFormView
的任何子类)将在form\u valid
中返回HttpResponseDirect
。当您在form\u valid
方法中调用super
的方法时,您还将返回一个HttpResponseRedirect
。在此过程中,实际的POST
数据丢失,尽管您将其作为GET
参数传递,但它并未在实际表单中使用
要解决此问题,您不需要在form\u valid
方法中调用super
,而是在HttpResponse
对象中返回呈现的模板,例如:
def form_valid(self, form):
self.query = form.cleaned_data['query']
self.concepts = # here is a long DB query; function(query)
return self.render_to_response(self.get_context_data(form=form))
等我回到电脑前,我会试试你的解决方案。然而,为什么POST数据会丢失?因为我在处理form_valid时保存了上下文,super内部的重定向应该知道这一点。我错了吗?这是HTTP级别的重定向-您告诉客户端浏览器在没有
POST
数据的情况下对成功url执行新请求。这是POST
请求的常见做法,因为这些请求通常会更改数据库中的数据,不应执行两次。通过重定向,用户不能意外地将数据发送到服务器两次。但是,在本例中,您使用数据生成响应,因此不应该重定向用户。您甚至可能希望在dispatch
方法上使用csrf\u豁免
decorator来允许跨站点请求。