django - 尝试将表单发送到视图,但无法获取视图所需的正确“post_id”。
问题描述
我在 comments/forms.py 中创建了一个表单
from django import forms
from .models import Comment
class CommentForm(forms.ModelForm):
class Meta:
model = Comment
fields = ('body',)
此表单在 comments/comment_form.html 中有一个模板:
<h2>this is the comment form</h2>
<form class="post-form" method="post" action="{% url 'comments:create' post.id %}">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
如您所见,我将此表单发送到评论:创建。这是处理表单的视图:
def create(request, post_id):
post = get_object_or_404(Post, pk= post_id)
group = post.group
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.author = request.user
comment.post = post
comment.pub_date = timezone.now()
comment.save()
return redirect('/groups/' + str(group.id))
else:
form = CommentForm()
return render(request, 'comments/comment_form.html', {'form':form})
问题是我在“groups/detail.html”上呈现表单:
{% include "comments/comment_form.html" %}
问题是这种形式显然需要一个 post_id 因为评论属于一个帖子。问题是我无法访问群组详细信息页面上的个人帖子,或者我至少不知道如何访问个人帖子。下面是组详细视图:
def detail(request, group_id):
group = get_object_or_404(Group, pk= group_id)
posts = Post.objects.filter(group__id = group_id)
post = posts.objects.first()
form = CommentForm(request.POST)
return render(request, 'groups/detail.html', {'group': group, 'posts':posts, 'post':post, 'form':form})
正如你所看到的,我只是抓住了第一篇文章(用于测试目的),即使那不是我想要的。我想抓住发表评论的帖子。我无法从 url 中获取它,因为在组详细信息页面中包含 post_id 没有意义。这是组详细信息页面的网址:
app_name = 'groups'
urlpatterns = [
path('<int:group_id>/', views.detail, name='detail'),
]
我只是想知道是否有办法在组详细信息页面上抓取单个帖子,以便我可以将表单提交到评论:创建视图,它可以正确处理它。评论创建视图需要一个 post_id:
def create(request, post_id):
post = get_object_or_404(Post, pk= post_id)
group = post.group
if request.method == "POST":
form = CommentForm(request.POST)
if form.is_valid():
comment = form.save(commit=False)
comment.author = request.user
comment.post = post
comment.pub_date = timezone.now()
comment.save()
return redirect('/groups/' + str(group.id))
else:
form = CommentForm()
return render(request, 'comments/comment_form.html', {'form':form})
简而言之,我需要在组详细信息视图中实例化一个变量,以便我可以将它传递到表单中,以便它可以将它提供给评论创建视图。有任何想法吗?
解决方案
做起来很容易,但对用户不太友好的是,在每个帖子下都有一个链接,该链接重定向到评论页面。然后在评论页面上,您将可以访问帖子 ID,因为您可以通过 URL 获取它。
这将是每个帖子下评论表单链接的 html:
postpage.html
{% for i in post %}
{{ i.post }}
<a href="/posts/{{i.pk}}">Comment on this Post!</a>
{% endfor %}
...然后重定向到您的评论表单页面...
评论表单 URL 将如下所示 = .../posts/[pk]
<h2>this is the comment form</h2>
<form class="post-form" method="post" action="">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="save btn btn-default">Save</button>
</form>
确保您的 URL 模式接受 PK。
然后在您看来,您将可以访问帖子的 pk 并将其分配给评论。
我会说肯定有更多用户友好的方式来做到这一点(例如弹出模式来写评论,这样你就不必离开页面),这可能包括某种形式的组合和 javascript/ajax .
推荐阅读
- python - 在实体组件系统中应该如何处理设置代码?
- unity3d - 同一物体没有统一发生碰撞
- java - 偶尔出现“未找到 Log4j 2 配置文件”消息
- angular - 由 AWS Amplify Auth 处理的 Stripe Connect 代码
- swift - 强制 swift 类的所有属性键和值小写
- angular - Angular 7 - 如何路由到新窗口位置或文件
- google-apps-script - 我的 googlescript 正在发送重复的电子邮件
- javascript - 在 BootstrapDialog 关闭时,html body 标签被破坏;呈现的空白页
- delphi - 有什么建议可以优化以下 delphi 代码吗?
- android-room - 如何将 SparseArray 保存在 Room 数据库中?