【问题标题】:Django blog reply systemdjango博客回复系统
【发布时间】:2023-03-23 14:05:01
【问题描述】:

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

【问题讨论】:

    标签: django blogs foreign-keys reply


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      我认为这是您需要处理的部分。当回复表单被呈现时,它需要有被回复的帖子的 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),
      }
      

      此代码应根据需要呈现表单。

      post id 必须沿链一路传递

      --post_id-> 渲染帖子 --post_id-> 渲染回复表单 --post_id-> 商店回复

      【讨论】:

      • 啊,好点。我在想,通过“回复表单出现”,表单已经在当前模板中呈现,只是被一些 JS 隐藏了。如果回复表单在不同的页面上,但是您需要将 post_id 从请求中拉出,如您所示。
      • 我已经按照你说的做了,这次我的错误是: KeyError at /replies/save_reply/ 我不应该将reply_to作为参数传递给函数吗?但是,作为回复的链接,我怎样才能输入这样的网址: r'^profile_view/(?P\d+)/$' ?我的意思是a href ='这里是什么'?谢谢
      【解决方案3】:

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

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

      谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-26
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多