首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django博客回复系统

Django博客回复系统
EN

Stack Overflow用户
提问于 2010-05-28 02:03:24
回答 3查看 671关注 0票数 2

我正在尝试建立一个迷你回复系统,基于用户在微博上的帖子。每个帖子都有一个名为回复的链接。如果一个人按下回复,回复表单就会出现,一个人编辑回复,然后提交form.The问题是我不知道如何获取我想回复的帖子的id。在视图中,如果我使用一个数字作为参数(作为博客文章的id ),它会将回复插入到数据库。但是,我如何才能做到这一点不硬编码呢?

视图是:

代码语言:javascript
复制
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中有:

代码语言:javascript
复制
  class ReplyForm(ModelForm):
    class Meta:
      model = Reply
      fields = ['reply']

在模型中:

代码语言:javascript
复制
class Reply(models.Model):
reply_to = models.ForeignKey(New)
creator = models.ForeignKey(User)
reply = models.CharField(max_length=140,blank=False)
    objects = NewManager()   

提一下New就是微博类

代码语言:javascript
复制
    thanks
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-05-29 04:36:02

嘿你好啊。我根据您的建议解决了这个问题,但我又创建了另一个。我在想,由于回复表单在另一个页面中,简单地点击回复链接无论如何都不会帮助我保留帖子的id,因为在我按下回复按钮之后,博客页面就消失了。因此,在我看来,我已经创建了一个函数,它将博客文章的id作为参数保存。它按应该的方式保存,没有问题,但现在我的问题是:我如何传递一个链接,比如

代码语言:javascript
复制
    url(r'^save_reply/(?P<id>\d+)/$', 
                       save_reply,
                       name='save_reply'), 

(这是我在urls.py中保存的内容)对每个帖子下面的回复?我的意思是,到目前为止,我的回复链接只是简单地调用回复/保存回复(我有回复)函数,但是现在,当我有id作为参数时,我怎么把它放在我的a href = 'what here‘中呢?

下面是我的views.py,它可以正常工作:

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

谢谢!

票数 3
EN

Stack Overflow用户

发布于 2010-05-28 05:28:17

您需要在您的表单中有一个隐藏字段,以捕获任何与注释相关的New实例的PK。

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

代码语言:javascript
复制
# forms.py
class ReplyForm(ModelForm):
    class Meta:
        model = Reply
        fields = ['reply', 'reply_to']
        widgets = {
            'reply_to': forms.HiddenInput),
        }

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

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

票数 1
EN

Stack Overflow用户

发布于 2010-05-29 00:06:42

如果用户按下回复,则会出现回复表单。

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

大致是这样的:

代码语言:javascript
复制
def save_reply(request):
    ...
    else:
        form = ReplyForm()
        form.reply_to = New.objects.get(id=request.REQUEST["post_id"])

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

同时,

代码语言:javascript
复制
widgets = {
        'reply_to': forms.HiddenInput),
}

代码这应该会在你需要的时候呈现表单。

帖子id必须一直沿链传递。

-- Post _id->呈现帖子--post_id->呈现回复表单--post_id->存储回复

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2923607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档