python - django:DetailView 如何适用于两个模型或基于类的 View 如何适用于两个模型?

标签 python django

我打算用Django写一个博客。在我的博客页面中,我想显示博客和评论,我尝试使用DetailView

class BlogDetailView(DetailView):

    template_name = 'inventory/item_detail.html'
    model = Blogitem

    def get_context_data(self, **kwargs):
        context = super(BlogDetailView, self).get_context_data(**kwargs)
        pk = self.kwargs.get('id')
        try:
            item = Blogitem.objects.get(pk=pk)
            item.view_number = item.view_number + 1
            item.save()
            comment_list  = Comment.objects.filter(comment_blog_id=pk).order_by(F('comment_date').asc())
            context['item'] = item
            context['comment_list'] = comment_list
        except Blogitem.DoesNotExist:
            raise Http404
        return context

错误:通用详细信息 View BlogDetailView 必须使用对象 pk 或 slug 调用..

我知道我需要添加类似 model = somethings 的代码或使用 get_queryset(self): 获取查询集下面template_name = 'inventory/item_detail.html'

如果我在template_name = 'inventory/item_detail.html'下面添加行(⇩⇩⇩)

model = Blogitem, Comment

我明白了 错误:'tuple'对象没有属性'_default_manager'

urls.py

url(r'^blog/(?P<id>(\d+))/$',views.BlogDetailView.as_view() , name='item_detail')

models.py

class Blogitem(models.Model):
    title            = models.CharField(max_length=200)
    content_html     = models.TextField() #html
    content_markdown = models.TextField() #markdown
    publication_date = models.DateTimeField()
    update_date      = models.DateTimeField()
    first_tag        = models.CharField(max_length=200,
                                        default= 'other') 
    tag_supplement   = models.CharField(max_length=100) #tag supplement
    view_number      = models.IntegerField()
def __str__(self):
    return (u'%s %s') %(self.title,self.publication_date)

class Admin:
    pass

class Meta:
    ordering = ['publication_date']
    verbose_name_plural = verbose_name = 'blog'




class Comment(models.Model):
    comment_blog = models.ForeignKey(Blogitem, verbose_name=u'blog')
    comment_user = models.ForeignKey(UserProfile, verbose_name= u'user',blank= True,null = True)
    comment_date = models.DateTimeField(verbose_name=u'comment date',auto_now = True)
    comment_content = models.TextField(verbose_name=u'comment words')
    comment_approved = models.BooleanField(verbose_name=u'comment approved',default= True)
    comment_like = models.IntegerField(verbose_name=u'like number',default=0)

    def __str__(self):
        return (u'%s %s %s %s') % (self.comment_blog, self.comment_user, self.comment_content, self.comment_date)

    class Meta:
        ordering = ['-comment_date']
        verbose_name_plural = verbose_name = 'comment'

我知道我可以使用基于函数的 View 修复该错误,但不能使用基于类的 View 修复该错误:

urls.py

url(r'^blog/(?P<id>(\d+))/$',views.item_detail , name='item_detail')

views.py

def item_detail(request, id):
    '''
    detail of blog
    '''
    try:
        item = Blogitem.objects.get(id=id)
        item.view_number = item.view_number + 1
        item.save()
        comment_list  = Comment.objects.filter(comment_blog_id=item.id).order_by(F('comment_date').asc())
    except Blogitem.DoesNotExist:
        raise Http404
    return render_to_response( 'inventory/item_detail.html', {'item': item,'comment_list': comment_list}, context_instance=RequestContext(request))

DetailView 如何适用于两个模型,或者如何使用基于类的 View 适用于两个模型?

最佳答案

您必须在详细信息 View 中指定您的型号。并在get_context_data

中添加comments_list
class BlogDetailView(DetailView):
    model = Blogitem
    template_name = 'inventory/item_detail.html'
    slug_field = 'pk'

    def get_context_data(self, **kwargs):
        context = super(BlogDetailView, self).get_context_data(**kwargs)
        context['comment_list']  = Comment.objects.filter(comment_blog_id=pk).order_by(F('comment_date').asc())
        # other code
        return context

url.py

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

关于python - django:DetailView 如何适用于两个模型或基于类的 View 如何适用于两个模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38010597/

相关文章:

django - 在 django 中上传自定义模板

python - 仅在我的两个相同网站之一上出现导入错误

python - 如何将 CharField 作为字符串操作 Django

python - 如何使用 Matplotlib 在 python 中定义和绘制 10*10 数组?

django - django rest framework swagger open api security object definition for oauth2 flow 是密码的设置是什么?

python - 我什么时候应该在 Django 中使用惰性函数

django - 在中间件而不是 View 中测试 is_authenticated()

python - 如何确定 struct.unpack 的格式(因为我没有用 Python 打包)?

python - pip如何使包可执行?

python - Bash 完成脚本的单元测试