如何从自由文本字段获取POST数据?

时间:2014-02-03 22:09:59

标签: python django post

执行民意调查教程的修改版本。当我进入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),那会很有帮助。谢谢。

2 个答案:

答案 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