如何从一个模板访问多个通用视图?

时间:2013-10-22 11:30:01

标签: python django templates generics views

首先,抱歉我的愚蠢问题,但我没有找到我的问题的答案。

我正在尝试弄清楚如何从Django中的一个模板访问多个通用视图。

实施例: 我有一个Blogpost详细信息 - 视图:

class PostView(generic.DetailView):
    model = Post
    template_name = "blog/detail.html"

创建新评论的表单:

class CommentCreate(CreateView):
model = Comment
    template_name = "blog/test.html"
    fields = ['author', 'email', 'comment']

在我的urls.py中,我正在使用以下语句访问Detail-View:

url(r'^(?P<pk>\d+)/$', views.PostView.as_view(), name='detail')

显然,我无法通过调用DetailView上的as_view()函数来访问我的表单。

有了这个,我真的无法弄清楚,如何将CommentCreate-Form添加到我的模板中。

如何在另一个通用视图的模板中访问通用视图或表单的数据?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

使用mixins! 也许你可以使用SingleObjectMixin,但我会告诉你如何使用(和创建)mixin。

class DetailViewMixin(object):
    details_model = None
    context_detail_object_name = None

    def get_context_data(self, **kwargs):
        context = super(DetailViewMixin, self).get_context_data(**kwargs)
        context[self.context_detail_object_name] = self.get_detail_object()
        return context

    def get_detail_object(self):
        return self.details_model._default_manager.get(pk=self.kwargs['pk'])

class CommentCreate(DetailViewMixin, CreateView):
    details_model = Post
    context_detail_object_name = 'post'
    model = Comment
    template_name = "blog/test.html"
    fields = ['author', 'email', 'comment']

现在,您有一个&#39;表格&#39;模板中的变量和帖子&#39;变量

修改

您不能同时使用2个通用视图,它们都使用SingleObjectMixin作为其模型。

希望帮助

答案 1 :(得分:0)

根据@bruno desthuilliers的建议,我尝试了一种不使用通用视图的不同方法:

在models.py中添加:

from django.forms import ModelForm

class CommentCreate_ungen(ModelForm):
class Meta:
    model = Comment
    fields = ['author', 'email', 'comment']

在views.py而不是基于通用类的视图中使用这些函数:

from django.shortcuts import render_to_response
from blog.models import CommentCreate_ungen

def index_ungen(request):
    post = Post.objects.all()
    return render_to_response('blog/index_ungen.html', {'post': post})

def detail_ungen(request, pk):
    post = Post.objects.get(pk=pk)
    form = CommentCreate_ungen()
    return render_to_response('blog/detail_ungen.html', {'post': post, 'form': form})

对我来说,这似乎更容易!