Django从views.py动态获取PK

时间:2019-12-12 18:45:11

标签: python django

我有一个视图,该视图可以呈现评论形式以及模板:

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,以使评论转到正确的帖子。

2 个答案:

答案 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()
相关问题