我正在开发一个教育拍卖应用程序,它应该允许用户出价并向现有拍卖列表添加评论。我想将评论实现为 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 %}?