如何使用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()
。编辑时输入错误。现在该怎么办?此错误显示“内置函数”或“方法”对象不可下标。