使用表单后修改上下文

Modify context after using form

我有一个显示具有特定标签的对象列表的视图。

class AllView(ListView):

    context_object_name = 'facts'
    template_name = 'facts_blog/all_facts.html'

    def get_context_data(self, **kwargs):
        context = super(AllView, self).get_context_data(**kwargs)
        if 'TagForm' not in context:
            context['TagForm'] = TagForm()
        return context

    def get_queryset(self):
        form = TagForm(self.request.GET)
        if form.is_valid():
            context = RequestContext(self.request)
            return self.send_results(form.cleaned_data['tag'])
        else:
            return Fact.objects.all()

    def send_results(self, tag):
        return Fact.objects.filter(tags__slug=tag)

我想 return form.cleaned_data['tag'] 到模板,但我已经用过 get_context_data...我应该怎么做才能做到这一点?

如果我理解你在说什么,你想在上下文字典中包含 "tag" 而 ListView 查询集将 return "Fact" 与标签。正确吗?

如果您查看 Django 的 BaseListViewget 方法将首先调用 get_queryset,然后在调用 render_to_response 之前调用您的 get_context_data方法:

class BaseListView(MultipleObjectMixin, View):
    """
    A base view for displaying a list of objects.
    """
    def get(self, request, *args, **kwargs):
        self.object_list = self.get_queryset()
        allow_empty = self.get_allow_empty()

        # [snip]
        # some code not related to this omitted
        # [snip]

        context = self.get_context_data()
        return self.render_to_response(context)

你可以做的是在你的 get_queryset 方法中设置一个属性 (self.object) 来存储你验证过的表单中的 "tag",然后在你的 get_context_data 方法,以便您可以将其填充到上下文字典中:

def get_queryset(self):
    form = TagForm(self.request.GET)
    if form.is_valid():
        context = RequestContext(self.request)
        # set self.object to the "tag"
        self.object = form.cleaned_data['tag']
        return self.send_results(self.object)
    else:
        # set self.object to None since the form is not validated
        self.object = None
        return Fact.objects.all()

def get_context_data(self, **kwargs):
    context = super(AllView, self).get_context_data(**kwargs)
    if 'TagForm' not in context:
        context['TagForm'] = TagForm()
    # put self.object in the context dict
    context['tag'] = self.object
    return context

您的模板将有一个名为 tag 的变量,其值为 "tag" 或 None.

假设表单的actionreturns通过GET请求到AllView视图,可以这样修改get_context_data

def get_context_data(self, **kwargs):
    context = super(AllView, self).get_context_data(**kwargs)
    if 'TagForm' not in context:
        context['TagForm'] = TagForm()

    tag_form = TagForm(self.request.GET)
    if tag_form.is_valid():
        context['tag'] = tag_form.cleaned_data.get('tag')

    return context

希望它能解决问题。