我有一个视图,该视图可以呈现评论形式以及模板:
views.py
def news(request):
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.post = Article.objects.get(pk=2)
print(comment.post)
comment.author = request.user.username
comment.save()
return HttpResponseRedirect('')
else:
form = CommentForm()
return render(request, '../templates/news.html', context={"form": form})
models.py
class Comment(models.Model):
post = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments', blank=True)
author = models.TextField()
text = models.TextField()
def __str__(self):
return self.text
forms.py
class CommentForm(ModelForm):
class Meta:
model = Comment
fields = ('text',)
在views.py中,其中 comment.post 被分配给Article对象,我希望pk动态地应用。我尝试在模板中执行此操作,在模板中将{{article.pk}}放置在Article对象的正确pk处,但是我不确定如何将其应用于表单。
模板看起来很简单:Article对象,在其下方是注释表单。
问题很简单,我希望news(request)函数动态应用当前Article对象的pk,以使评论转到正确的帖子。
答案 0 :(得分:0)
如果路径是唯一的,则可以使用该路径,也可以仅添加一个隐藏字段并将商品pk设置为值:
<input name="post" type="hidden" value={{ article.pk }} />
您的表格:
class CommentForm(ModelForm):
class Meta:
model = Comment
fields = ('text', 'post')
,您可以从视图中的验证数据访问它。
答案 1 :(得分:0)
也许我不太了解,您的评论是在帖子列表中还是在单个帖子页面中? 如果此表单位于单个帖子页面,则您的代码可能大致如下:
from django.shortcuts import get_object_or_404, render
from .models import Post, CommentForm
def post(request, slug): # or pk
current_post = get_object_or_404(Post, slug=slug)
comment_form = CommentForm(request.POST or None)
if comment_form.is_valid():
comment = comment_form.save(commit=False)
comment.post = current_post
print(comment.post)
comment.author = request.user.username
comment.save()
return HttpResponseRedirect('')
context = {
'post': current_post,
'comment_form': comment_form,
}
return render(request, '../templates/post.html', context)
您可能只希望注册用户可以发表评论,这样您就不会出现垃圾邮件问题。在这种情况下,您的代码可能是:
from django.contrib.auth.models import User
class Comment(models.Model):
post = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='comments', blank=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
text = models.TextField()
def __str__(self):
return self.text
# views.py
...
if request.user.is_authenticated() and comment_form.is_valid():
comment = comment_form.save(commit=False)
comment.post = current_post
comment.author = request.user
comment.save()