2015-03-29 2 views
0

У меня есть представление, которое показывает список объектов с определенным тегом.Изменить контекст после использования формы

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) 

Я хочу вернуть form.cleaned_data [ «тег»] в шаблоне, но я уже использовал get_context_data ... Что я должен сделать, чтобы сделать это?

ответ

0

Если я понимаю, что вы говорите, вы хотите включить «тег» в свой контекст dict, в то время как набор запросов ListView вернет экземпляры «Fact», связанные с тегом. Верный?

Если посмотреть на Джанго 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) 

Что вы можете сделать, это установить атрибут (self.object) в ваш метод get_queryset для хранения «метки» с вашей проверенной формы, а затем получить его в вашем методе get_context_data так что вы можете запихнуть его в контексте Dict:

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.

+0

Да, это именно то, что я хотел, и ваше решение это сделало. Спасибо! – pythad

0

Предполагая, что возвращает действие формы на представление Allview через запрос GET, вы можете изменить 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 

Надеется, что это делает трюк.

Смежные вопросы