如何使用get_context_data Django按用户和文章筛选评论?

如何使用get_context_data Django按用户和文章筛选评论?,django,django-models,django-forms,django-views,django-templates,Django,Django Models,Django Forms,Django Views,Django Templates,我想按用户和帖子过滤评论。您想告诉我如何使用get\u context\u data过滤评论吗。我在代码“NewsDetailView”对象没有属性“get\u object\u或\u 404”时遇到此错误如何解决此问题 models.py class Comment(models.Model): article = models.ForeignKey(Article, on_delete=models.CASCADE) commentator = models.ForeignK

我想按用户和帖子过滤评论。您想告诉我如何使用
get\u context\u data
过滤评论吗。我在代码
“NewsDetailView”对象没有属性“get\u object\u或\u 404”时遇到此错误
如何解决此问题

models.py

class Comment(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE)
    commentator = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField(max_length=200)
    created_on = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.article.title
views.py

class NewsDetailView(LoginRequiredMixin, DetailView):
    model = Article
    form_class = CommentForm
    template_name = 'news/news_detail.html'


    def get(self, request, *args, **kwargs):
        self.object = self.get_object_or_404(User, username=self.kwargs.get('username'))
        self.object = self.get_object_or_404(Article, pk=self.kwargs.get('pk'))
        return super().get(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = self.object
        context['form'] = CommentForm()
        return context

    def post(self, request, *args, **kwargs):
        if request.method == 'POST':
            form = CommentForm(request.POST)
            form.instance.article = Article.objects.get(
                pk=self.kwargs.get('pk'))
            form.instance.commentator = self.request.user
            form.save()
            return redirect('news:news-detail', pk=self.kwargs.get('pk'))
        else:
            return redirect('news:news-detail', pk=self.kwargs.get('pk'))

NewsDetailView
确实没有
get\u object\u或_404
,因此使用
self.get\u object\u或_404
没有任何意义。此外,这根本没有必要

您可以通过
self.object.Comment\u set.filter(评论员\用户名=用户名)

您可以进一步使用,以避免使用一些样板代码来构造表单并重定向到成功url:

from django.urls import reverse
from django.views.generic.edit import FormMixin

class NewsDetailView(LoginRequiredMixin, FormMixin, DetailView):
    model = Article
    form_class = CommentForm
    template_name = 'news/news_detail.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['comments'] = self.object.comment_set.filter(
            commentator__username=self.kwargs['username']
        )
        return context

    def post(self, request, *args, **kwargs):
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
    
    def form_valid(self, form):
        form.instance.article_id = self.kwargs['pk']
        form.instance.commentator = self.request.user
        form.save()
        return super().form_valid(form)
    
    def form_invalid(self, form):
        self.object = self.get_object()
        return super().form_invalid(form)

    def get_success_url(self):
        return reverse('news:news-detail', kwargs={'pk': self.kwargs['pk']})
从django.url反向导入
从django.views.generic.edit导入FormMixin
类NewsDetailView(LoginRequiredMixin、FormMixin、DetailView):
模型=文章
form_class=CommentForm
模板名称='news/news\u detail.html'
def获取上下文数据(自身,**kwargs):
context=super()。获取上下文数据(**kwargs)
上下文['comments']=self.object.comment\u set.filter(
评论员__username=self.kwargs['username']
)
返回上下文
def post(自我、请求、*args、**kwargs):
form=self.get\u form()
如果form.is_有效():
返回self.form\u有效(form)
其他:
返回自我。表单_无效(表单)
def表单_有效(自身、表单):
form.instance.article_id=self.kwargs['pk']
form.instance.commentor=self.request.user
form.save()
返回super().form_有效(form)
def表单_无效(自身、表单):
self.object=self.get_object()
return super().form_无效(form)
def get_success_url(自我):

return reverse('news:news detail',kwargs={'pk':self.kwargs['pk']})
现在我得到了这个错误
commentor\uu username=self.kwargs['username'])key错误:'username'
?@afi:这意味着你的
url
没有
username
参数。如果你想使用登录的用户,你应该使用
request.user
,而不是
self.kwargs['username']
。现在我添加了类似
self.request.user的内容。它的工作细节页面已加载,但我正在尝试发表评论,现在我收到错误
TypeError:'QueryDict'对象不可调用
我该怎么做do@afi:是的,它是
form=self.get\u form()
。编辑时输入错误。现在该怎么办?此错误
显示“内置函数”或“方法”对象不可下标。