如何将两个相似的视图合二为一

时间:2015-02-24 11:19:21

标签: django views

我有两个视图,一个是标签,另一个是类别。即标记字段包含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 框架。我可以用这个做我想做的事吗?

1 个答案:

答案 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>