直接GET好吗?怎么做?

时间:2015-04-17 22:38:57

标签: django django-forms django-views

我有一个处理ListView和from的视图,它使用GET并根据它们在同一页面上的标记返回过滤的东西。这是它:

class AllView(AjaxListView):

context_object_name = 'smth'
template_name = 'blog/all_things.html'
page_template = 'blog/things.html'

def get_queryset(self):
    form = TagForm(self.request.GET)
    if form.is_valid():
        self.tag_name = (form.cleaned_data['tag']).lower()
        return self.send_results(self.tag_name)
    else:
        self.tag_name = "All"
        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()
    context['tag'] = self.tag_name
    return context

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

现在并且希望通过简单的链接制作相同的内容。 例如,我有<a>Food</a>,我希望它转到?tag=food。我做了一件非常愚蠢的事情,但它有效: 网址:

url(r'^(?P<tag>[\w-]+)$', views.TagView, name='tag'),

查看:

def TagView(request, tag):
# change this someday...
return HttpResponseRedirect(reverse('blog:all') + '?tag={}'.format(tag))

我明白这是愚蠢的,有没有明智的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您就不需要第二个视图和网址格式。您可以检查&#39;标签的存在情况。参数并根据该参数创建查询集。

def get_queryset(self):
    if self.request.GET.get('tag'):
        self.tag_name = self.request.GET['tag']
        return self.send_results(self.tag_name)
    else:
       self.tag_name = "All"
       return Fact.objects.all()

对于模板HTML中的硬编码链接,您可以使用:

<a href="{% url 'your_view' %}?tag=AAA">Tag AAA</a>