【问题标题】:Django comment formDjango 评论表单
【发布时间】:2022-01-01 13:24:59
【问题描述】:

我正在按照 Django 中心 https://djangocentral.com/creating-comments-system-with-django/ 提供的创建评论指南进行操作,它正在工作。但是,我使用的是{{ form.as_p }},如表格所示,它将提供 3 个字段,包括姓名、电子邮件和正文。但我想有预定义的名称,这将是您登录时使用的用户名和附加到该帐户的电子邮件。我将如何继续创建它?

forms.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['name', 'email', 'body']

models.py

class Comment(models.Model):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    name = models.CharField(max_length=255)
    email = models.EmailField()
    body = models.TextField()

    date_added = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-date_added']

    def __str__(self):
        return self.name
    

views.py

def post_detail(request, category_slug, slug, status=Post.ACTIVE):
    post = get_object_or_404(Post, slug=slug)

    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
           comment = form.save(commit=False)
           comment.post = post
           comment.save()

           return redirect('post_detail',  category_slug=category_slug, slug=slug)
    else:
        form = CommentForm()

    return render(request, 'blog/post_detail.html', {'post': post, 'form': form})

在 html 模板中

{% if user.is_authenticated %}
    <h2 class="subtitle is-4">Comments</h2>
<form method="post" class="mb-6">
    {% csrf_token %}
    {{ form.as_p }}
    <div class="field">
        <div class="control">
            <button class="button is-success">Submit comment</button>
         </div>
    </div>
</form>
{% endif %}

【问题讨论】:

  • 您的用户在发表评论时是否经过身份验证?
  • user.is_auth 是只有经过身份验证的用户才能看到表单,所以不需要写姓名和电子邮件,当用户通过身份验证时已经有姓名和电子邮件给他/她的帐户

标签: python html django


【解决方案1】:

如果要预先设置用户名和电子邮件字段,可以使用initial 表单参数,如下所示:

views.py

def post_detail(request, category_slug, slug, status=Post.ACTIVE):
    post = get_object_or_404(Post, slug=slug)

    if request.method == 'POST':
        form = CommentForm(request.POST)
        if form.is_valid():
           comment = form.save(commit=False)
           comment.post = post
           comment.save()

           return redirect('post_detail',  category_slug=category_slug, slug=slug)
    else:
        user = request.user
        form = CommentForm(initial={"name": user.username, "email": user.email})

        return render(request, 'blog/post_detail.html', {'post': post, 'form': form})

forms.py

class CommentForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['name'].disabled = True
        self.fields['email'].disabled = True 
        
       # OR set readonly widget attribute.
       # self.fields['name'].widget.attrs['readonly'] = True
       # self.fields['email'].widget.attrs['readonly'] = True

    class Meta:
        model = Comment
        fields = ['name', 'email', 'body']

【讨论】:

  • 好的,可以,但仍然可以更改名称和电子邮件字段。我该如何处理,这样就没有更改姓名和电子邮件的选项?
  • 您可以在创建字段时使用 disabled 参数或 readonly 属性,但您现在使用的是元类。为此,您可以覆盖__init__ 方法(我更新了答案,您可以在那里查看如何操作)。
  • 最后一个问题,假设没有用户名的人想要访问该站点,他们无法编写 cmets,但现在由于表单的更改,我在尝试访问时收到错误 no email in object详细的帖子页面。由于电子邮件是只读的。
  • 您可以添加一些条件如if user.username: 然后添加initial 参数否则使用form=CommentForm()
猜你喜欢
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-06
  • 2012-04-10
  • 2011-04-09
  • 2011-05-17
相关资源
最近更新 更多