0

我正在开发一个教育拍卖应用程序,它应该允许用户出价并向现有拍卖列表添加评论。我想将评论实现为 CommentForm 并将此表单的片段 comment_add.html 包含到 view_listing.html 模板中,该模板又扩展了基本 layout.html。

但 view_listing.html 最初不显示来自 comment_add.html 的输入字段。“textarea”输入字段仅在按下“提交按钮”后才会显示,因为它是必填字段。

预期结果: 页面“评论”区域截图

实际效果: 页面“评论”区截图

按下“提交”后的结果: 页面“评论”区域的截图

当然,在 comment_add.html 中将评论输入字段实现为 <input> 是可行的。

我猜这个问题与从其他视图传递给 view_listing.html 的相同上下文有关(所有视图的上下文变量名称都相同 - “列表”)。但到目前为止,我无法弄清楚这个决定。

视图.py

def comment_add(request, listing_id):
    listing = Listing.objects.get(pk=listing_id)
    if request.method == "POST":
        form = CommentForm(request.POST)
        if form.is_valid():
            text = form.cleaned_data["text"]
            author  = User.objects.get(pk=request.user.id)
            comment = Comment(text=text, author=author)
            comment.save()
            context = {"form": form, "listing": listing}
            return HttpResponseRedirect(reverse("auctions:listing", args=(listing.id,)))
        else:
            context = {"form": form, "listing": listing, "watched": watched}
            return render(request, "auctions/view_listing.html", context)
    else:
        context = {"form": CommentForm(), "listing": listing, "watched": watched}
    
    return render(request, "auctions/view_listing.html", context)

模型.py

class Comment(models.Model):
    text = models.CharField(max_length=1024)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=CASCADE, related_name="author")
    date = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.text

表格.py

class CommentForm(forms.ModelForm):
    text = forms.CharField(widget=forms.Textarea, max_length=1024, label="Comment")

    class Meta:
        model = Comment
        fields = ("text",)

模板:

view_listing.html

{% extends 'auctions/layout.html' %}
...more code here...
{% if user.is_authenticated %}
    {% if not watched %}
        <div>
            <span><a type="button" class="btn btn-primary" 
                    href="{% url 'auctions:watchlist_add' listing_id=listing.id %}">
                    Add to Watchlist</a></span>
        </div>
    {% else %}
        <div>
            <span class="btn btn-secondary">In Watchlist</span>
        </div>
    {% endif %}
    {% include "auctions/close_listing.html" %}
    {% include "auctions/comment_add.html" %}
{% endif %}

comment_add.html

<form action="{% url 'auctions:comment_add' listing.id %}" method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit Comment">
</form>

我应该怎么做才能以这种确切的方式实现评论:使用 CommentForm 和 {% include %} / {% extends %}?

4

0 回答 0