执行民意调查教程的修改版本。当我进入python manage.py shell时,注释与数据库一起工作,但我无法让它实际读取帖子数据。每次发布评论时,页面都会重新呈现,但数据库中没有评论。
以下是我个人参赛作品的模型和评论
import datetime
from django.db import models
from django.utils import timezone
from django.forms import ModelForm
class Entry(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
pub_date = models.DateTimeField('date published')
class Comment(models.Model):
entry = models.ForeignKey(Entry)
comment = models.TextField()
comment_date = models.DateTimeField()
在Python shell中,我能够完美地创建评论(显示在管理员中)。
>>> from blog.models import Entry, Comment
>>> e = Entry.objects.get(pk=1)
>>> from django.utils import timezone
>>> e.comment_set.create(comment="isn't it pretty to think so?", comment_date=timezone.now())
<Comment: isn't it pretty to think so?>
在每个博客条目的detail.html视图中,用户可以添加评论。
<h1>{{ entry.title }}</h1>
<p>{{ entry.body }}</p>
<p>{{ entry.tags_set.all }}</p>
<form action="{% url 'blog:comment' entry.id %}" method="post">
{% csrf_token %}
<textarea name="comment101" style="width:300px; height: 70px; maxlength="300"; display:none;">
</textarea></br>
<input type="submit" name="comment101" value="Add comment" />
</form>
详细和评论的观点:
from django.utils import timezone
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
from blog.models import Entry, Tags, Comment
def detail(request, entry_id):
entry = get_object_or_404(Entry, pk=entry_id)
return render(request, 'entries/detail.html', {'entry': entry})
def comment(request, entry_id):
p = get_object_or_404(Entry, pk=entry_id)
add_comment = request.POST['comment101']
#get input name comment from POST data
p.comment_set.create(comment="add_comment", comment_date=timezone.now())
return HttpResponseRedirect(reverse('blog:detail', args=(p.id)))
我已经筋疲力尽了。我尝试在detail.html中的每个输入/表单中添加name ='comment101',我的注释视图正好复制了我在Python shell中所做的事情。
最后,如果有人能指点我调试涉及POST数据的代码(对于Mac),那会很有帮助。谢谢。
答案 0 :(得分:0)
我会用
c = Comment(comment=add_comment, comment_date=timezone.now(), entry=p)
c.save()
这可能有些用处。
此外,如果您想调试代码,最好放置
import pdb; pdb.set_trace()
可以在任何地方为您提供交互式控制台。
如果你想使用更好的东西,请使用ipdb(pip install ipdb)
import ipdb; ipdb.set_trace()
答案 1 :(得分:0)
我建议您使用request.POST.get
来获取发布数据:
add_comment = request.POST.get('comment101',None)
如果没有传递,则None为默认值。然后在以下行中,您应该通过简单的if语句检查add_comment是否为None:
if add_comment is not None:
#do the work
我还建议您使用request.method == 'POST'
来控制请求类型。
然后你可以创建评论:
comment = Comment()
comment.comment = add_comment;
comment.comment_date = timezone.now()
comment.entry = p
comment.save()
要调试,我个人使用print关键字。如果您想查看所有发布数据,您可以迭代并打印它们。当您使用print关键字或方法(对于python 3)时,您可以从./manage.py runserver
输出中看到输出。
for key, value in request.POST.iteritems():
print key, value