0

首先,对不起我的菜鸟问题,但我没有找到我的问题的答案。

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

示例:我有一个博客帖子详细信息视图:

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 中,我使用以下语句访问详细视图:

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

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

有了这个,我真的不知道如何将 CommentCreate-Form 添加到我的模板中。

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

谢谢你的帮助!

4

2 回答 2

1

使用混合!也许您可以使用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']

现在,您的模板中有一个“form”变量和一个“post”变量。

编辑

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

希望有所帮助

于 2013-10-22T12:12:01.917 回答
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})

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

于 2013-10-23T10:47:23.460 回答