使用表单后修改上下文
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 的 BaseListView
,get
方法将首先调用 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
希望它能解决问题。
我有一个显示具有特定标签的对象列表的视图。
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 的 BaseListView
,get
方法将首先调用 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
希望它能解决问题。