我有两个视图,一个是标签,另一个是类别。即标记字段包含ManyToManyField,类别与我的帖子模型具有ForeginKey关系。我的两个观点在这里:
def tag_posts(request, slug):
tag = get_object_or_404(Tags, slug=slug)
posts = tag.post_set.all()
return render(request, 'blog/cat_and_tag.html', {'posts': posts})
def category_posts(request, slug):
category = get_object_or_404(Category, slug=slug)
posts = category.post_set.all()
return render(request, 'blog/cat_and_tag.html', {'posts': posts})
我想要这个:
def new_view(request, slug):
instance = get_object_or_404([I want model name dynamic], slug=slug)
posts = instance.post_set.all()
return render(request, 'blog/cat_and_tag.html', {'posts': posts})
有没有办法将这两个视图合并为一个视图?我读到了 contenttypes 框架。我可以用这个做我想做的事吗?
答案 0 :(得分:1)
你可以通过一些网址改变魔法来实现这一点。这是你的观点:
def new_view(request, type, slug):
if type == 'tag':
instance = get_object_or_404(Tags, slug=slug)
elif type == 'category':
instance = get_object_or_404(Category, slug=slug)
else:
return Http404()
posts = instance.post_set.all()
return render(request, 'blog/cat_and_tag.html', {'posts': posts})
然后,在urls.py
:
url(r'^(?P<type>\w+)/(?P<slug>\d\w_+)$', 'project.views.project_edit', name='posts_by_type')
现在,您可以在模板代码中使用新网址,如下所示:
<a href="{% url 'posts_by_type' 'tag' slug %}">...</a>
或
<a href="{% url 'posts_by_type' 'category' slug %}">...</a>