实际上,我不确定问题究竟是什么,但我认为表单/模板中的数据没有传递到我的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。
答案 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
不能为无,这表示parent
为None
。如果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会有所帮助。