尝试将表单发送到视图,但无法获取视图所需的正确“post_id”。

时间:2018-05-14 13:58:23

标签: django django-models django-forms django-templates django-views

我在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})

正如你所看到的,我只是抓住了第一篇文章(用于测试目的),即使这不是我想要的。我希望抓住评论所针对的帖子。我无法从网址获取它,因为为组详细信息页面包含post_id是没有意义的。这是组详细信息页面的URL:

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})

简而言之,我需要在组详细信息视图中实例化一个变量,以便我可以将其传递给表单,这样它就可以将它提供给注释创建视图。任何想法?

1 个答案:

答案 0 :(得分:1)

在每个帖子下面都有一个重定向到评论页面的链接,但是用户友好一点也很容易。然后在评论页面上,您可以访问帖子ID,因为您可以通过URL获取它。

这将是您在每个帖子下的评论表单链接的html:

postpage.html

{% for i in post %}
    {{ i.post }}
    <a href="/posts/{{i.pk}}">Comment on this Post!</a>
{% endfor %}

...然后重定向到您的评论表单页面

评论表单网址将如下所示= ... / 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>

确保您的网址格式接受PK。

然后在您的视图中,您将可以访问帖子的pk并将其分配给评论。

我会说,肯定有更多用户友好的方式(例如弹出模式来编写评论,这样你就不必离开页面),这可能包括某种组合formsets和javascript / ajax。