来自POST请求的数据未从模板/表单传递到django中的视图

时间:2015-11-24 09:45:24

标签: python django post

实际上,我不确定问题究竟是什么,但我认为表单/模板中的数据没有传递到我的Django应用程序中的视图。

运行测试给出:

AttributeError: 'NoneType' object has no attribute 'id'

表格:

    <form action="/{{ link.id }}/{{ node.id }}/" method="post" class="comment-form">
        {% csrf_token %}
        {% for field in form %}
            {{ field.label_tag }} {{ field }}
            {% if field.help_text %}
            <p class="help">{{ field.help_text|safe }}</p>
            {% endif %}
        {% endfor %}
        <input type="submit" value="submit">
    </form>

观点:

def comments(request, link_id, comment_id=None):
    link = get_object_or_404(Link, pk=link_id)
    if comment_id is not None:
        parent = get_object_or_404(Comment, pk=comment_id)
    else:
        parent = None
    comments = link.comments.all()
    if request.method == 'POST':
        if request.user.is_authenticated():
            form = CommentForm(data=request.POST,auto_id=True)
            if form.is_valid():
                form.full_clean()
                new_comment = form.save(commit=False)
                new_comment.link = link
                new_comment.parent = parent
                new_comment.save()
                return reverse('comments', kwargs={'link_id':link.id,'comment_id':parent.id})
        else:
            return HttpResponseRedirect('/accounts/login/?next=/{0}/'.format(link.id))
    else:
        form = CommentForm(auto_id=True)
        return render(request, 'posts/comments.html', {'nodes':comments, 'link': link, 'form': form})

完整的relevant code is here,因为对于一个stackoverflow帖子来说可能有点多了。 (这是否有指导原则?)

这是(现在正在工作)project

2 个答案:

答案 0 :(得分:2)

这是追溯的关键部分。

    File "/Users/robin/learning/python/parrot/posts/views.py", line 42, in comments
return reverse('comments', kwargs={'link_id':link.id,'comment_id':parent.id})

AttributeError:'NoneType'对象没有属性'id'

由于link不能为无,这表示parentNone。如果parent_id为无,则可能需要使用其他网址。

视图应返回HttpResponse,而不是网址。我想你想要:

return HttpResponseRedirect(reverse('comments', kwargs={'link_id':link.id,'comment_id':parent.id}))

或者您可以使用redirect快捷方式:

from django.shortcuts import reverse
return redirect('comments', link_id=link.id, comment_id=parent.id)

答案 1 :(得分:1)

您在视图中说明:

    if comment_id is not None:
        parent = get_object_or_404(Comment, pk=comment_id)
    else:
        parent = None

但似乎你永远不会传递comment_id,只是link_id,因此在这一行:

return reverse('comments', kwargs={'link_id':link.id,'comment_id':parent.id})

parent始终为无。

查看您的网址映射以及CommentForm会有所帮助。

相关问题