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
Django-与Mixin组合的FormView_Django_Django Forms_Mixins_Django Class Based Views_Class Based Views - Fatal编程技术网

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来允许跨站点请求。