2

我正在尝试根据用户在迷你博客上的帖子构建一个迷你回复系统。每个帖子都有一个名为回复的链接。如果按下回复,回复表单出现,然后编辑回复并提交表单。问题是我不知道如何获取要回复的帖子的 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
4

3 回答 3

3

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

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

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

这是我的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/(例如)当然,我已经删除了我的外键字段,因为现在它是不必要的

谢谢!

于 2010-05-28T20:36:01.530 回答
1

您需要在表单中有一个隐藏字段来捕获与评论相关的任何 New 实例的 PK。

由于您使用的是 ModelForm,因此您的回复模型已经建立了 ForiegnKey 关系。您可以将小部件类型设置为隐藏,这样您的用户就看不到它了。

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

初始化ReplyForm 时,您可以填充reply_to 字段,例如- New 的实例在form = ReplyForm({'reply_to': new.pk})哪里new

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

于 2010-05-27T21:28:16.743 回答
1

如果按下回复,就会出现回复表格,

我认为这是你需要努力的部分。当回复表单被呈现时,它需要有被回复的帖子的 id(New 的实例)。这大概必须通过请求来,除非您有其他方法来跟踪它?

类似于以下内容:

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->渲染帖子--post_id->渲染回复表单--post_id->商店回复

于 2010-05-28T16:06:41.837 回答