2016-06-24 7 views
1

ich Hobel ein Blog mit Django.In meiner Blog-Seite zu schreiben, ich will Blog zeigen und kommentieren, habe ich versucht, Detailviewdjango: Wie funktionieren DetailView für zwei Modelle oder wie funktionieren klassenbasierte Ansichten für zwei Modelle?

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 

Fehler zu verwenden: Allgemeindetailansicht BlogDetailView mit entweder einem aufgerufen werden muss Objekt pk oder eine Schnecke ..

ich weiß, ich brauche Codes wie model = somethings hinzuzufügen oder zu erhalten queryset von get_queryset(self): unter template_name = 'inventory/item_detail.html'

verwenden, wenn ich die Linie (⇩⇩⇩) unter template_name = 'inventory/item_detail.html' hinzufügen

model = Blogitem, Comment 

ICH Fehler: 'tuple' Objekt hat kein Attribut '_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' 

Ich weiß, ich kann den Fehler mit funktionsbasierten Blick beheben, aber nicht klassenbasierte Blick:

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)) 

Wie funktioniert DetailView für zwei Modelle oder wie kann ich klassenbasierte Ansichten verwenden? rk für zwei Modelle?

+0

'model = BlogItem'. Sie müssen das Modell angeben, von dem Sie Details anzeigen möchten. – spectras

Antwort

1

Sie müssen Ihre model in der Detailansicht angeben. und fügen Sie comments_list in get_context_data

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 

urls.py

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

Es kann nicht funktionieren, ** Fehler **: AttributeError at/blog/8 /, Generische Detailansicht BlogDetailView muss entweder mit einem Objekt pk oder einem slug.Exception aufgerufen werden Location: \t /myvenv/lib/python3.4/ site-packages/django/views/generic/detail.py in get_object, Zeile 49 –

+0

@TaylorLively versuchen, ID zu entfernen und 'pk' (? P [^ /] +) in URLs hinzuzufügen. – MicroPyramid

+0

Ich brauche etwas Zeit, um die Vorlage zu ändern.es ist ok! Danke! –

Verwandte Themen