Django博客回复系统

时间:2010-05-27 18:03:24

标签: django blogs foreign-keys reply

我正在尝试根据用户在迷你博客上的帖子构建一个迷你回复系统。 每个帖子都有一个名为reply的链接。如果有人按回复,则会显示回复表单,并且会编辑回复,然后提交表单。问题是我不知道如何获取我要回复的帖子的ID。在视图中,如果我使用一个数字作为参数(作为博客文章的ID),它会将回复插入数据库。 但是我怎么能通过不硬编码来做到这一点?

观点是:

def save_reply(request):

  if request.method == 'POST':
    form = ReplyForm(request.POST)
    if form.is_valid():
       new_obj = form.save(commit=False)
       new_obj.creator = request.user
       new_post = New(1) #it works only hardcoded
       new_obj.reply_to = new_post
       new_obj.save()
       return HttpResponseRedirect('.')    
  else:
       form = ReplyForm()     
  return render_to_response('replies/replies.html', {
       'form': form,
       }, 
      context_instance=RequestContext(request))  

我在forms.py:

  class ReplyForm(ModelForm):
    class Meta:
      model = Reply
      fields = ['reply']

并在模特中:

class Reply(models.Model):
reply_to = models.ForeignKey(New)
creator = models.ForeignKey(User)
reply = models.CharField(max_length=140,blank=False)
    objects = NewManager()   

提到New是微博类

    thanks

3 个答案:

答案 0 :(得分:3)

嘿,那里。我用你的建议解决了这个问题,但我创造了另一个。 我在想,因为回复表单在另一个页面中,只需单击该回复链接就无法帮助我保留帖子ID,因为在我按下回复按钮后博客页面消失了。因此,在我看来,我创建了一个函数,将博客帖子的id作为参数保存。它可以保存它应该没有问题,但现在我的问题是:我如何通过链接

    url(r'^save_reply/(?P<id>\d+)/$', 
                       save_reply,
                       name='save_reply'), 

(这是我在urls.py中保留的内容) 每个帖子下的回复?我的意思是,直到现在,我的回复链接只是调用函数回复/ save_reply(我有回复)但是现在,当我将id作为参数时,我怎么能把它放在我的href ='what here'中?

这是我的views.py工作正常:

 def save_reply(request, id):

 if request.method == 'POST':
    form = ReplyForm(request.POST)
    if form.is_valid():
       new_obj = form.save(commit=False)
       new_obj.creator = request.user

       u = New.objects.get(pk=id)
       new_obj.reply_to = u   

       new_obj.save()
       return HttpResponseRedirect('.')    
 else:
       form = ReplyForm()     
 return render_to_response('replies/replies.html', {
       'form': form,
       }, 
      context_instance=RequestContext(request))  

我正在通过在浏览器中输入来打电话: http://127.0.0.1:8000/replies/save_reply/1/(例如) 当然,我已经删除了我的外键字段,因为现在它是不必要的

谢谢!

答案 1 :(得分:1)

您需要在表单中使用隐藏字段来捕获与评论相关的新实例的PK。

由于您使用的是ModelForm,因此您的回复模型已建立了ForiegnKey关系。您可以将widget类型设置为隐藏,以便您的用户看不到它..

# forms.py
class ReplyForm(ModelForm):
    class Meta:
        model = Reply
        fields = ['reply', 'reply_to']
        widgets = {
            'reply_to': forms.HiddenInput),
        }

初始化ReplyForm时,您可以填充answer_to字段,例如form = ReplyForm({'reply_to': new.pk}) - 其中new是新实例

顺便说一下,您可以考虑将New模型的名称更改为Post。 “新”有点难以谈论,而且有点令人困惑,因为“新”通常意味着在编程环境中完全不同。

答案 2 :(得分:1)

  

如果按下回复,则会显示回复表单,

我认为这是你需要做的工作。当呈现回复表单时,它需要具有回复它的帖子的ID(新的实例)。这可能是必须通过请求,除非你有其他方法来跟踪它?

有些事情:

def save_reply(request):
    ...
    else:
        form = ReplyForm()
        form.reply_to = New.objects.get(id=request.REQUEST["post_id"])

因此,你需要确保导致表单呈现的链接包含一个'post_id'参数(或类似的 - 可能你已经有一个等价物,用于显示有问题的帖子?)。

除了

widgets = {
        'reply_to': forms.HiddenInput),
}

代码,这应该根据需要呈现表单。

帖子ID必须一直沿着链传递

- post_id-&GT; 渲染帖子 --post_id-&gt; 呈现回复表单 --post_id-&gt; 商店回复