2010-05-27 85 views
2

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

的观点是:

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() 

提的是,新的微博客类

thanks 

回答

3

heyy there。我用你的建议解决了这个问题,但我创建了另一个。 我在想,由于回复表单位于另一个页面,只需单击该回复链接,无论如何都不会帮助我保留帖子ID,因为在我按下回复按钮后,博客页面消失了。所以,在我看来,我已经创建了一个函数来保存博客帖子的ID作为参数。它节省了只是因为它应该没有问题,但现在我的问题是:如何传递LIKE

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

链接(这是我在我的urls.py持有) 下各岗位的回答吗?我的意思是,直到现在,我的答复链接只是调用函数答复/ save_reply(我有答复),但现在,当我有作为参数的id,我怎么能把它放在我的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/(例如)当然 ,我已经打消了我的外键因为现在它是不必要的

谢谢!

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,你可以填充像form = ReplyForm({'reply_to': new.pk})的REPLY_TO场 - 在new是新

的一个实例

顺便说一句,你可能会考虑将你的New模型的名称改为Post之类的东西。 '新'有点难以谈及,有点混乱,因为'新'通常意味着在编程环境中完全不同。

+0

嗯..不,它不能解决我的问题,但。 – dana 2010-05-28 14:21:47

+0

你可以用新代码更新帖子吗? – 2010-05-28 14:56:21

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->商店回复

+1

啊好点。我认为,'回复表单出现'表单已经呈现在当前模板中,只是被一些JS隐藏起来。如果回复表单位于不同的页面上,则需要按照您的要求从请求中提取post_id。 – 2010-05-28 18:03:28

+0

我所做的就像你说的,这次我的错误是:KeyError at/replies/save_reply/ 不应该作为参数传递给函数reply_to? 但是,作为答复的链接,我怎么能把一个url:r'^ profile_view /(?P \ d +)/ $'?我的意思是一个href ='这里有什么'?谢谢 – dana 2010-05-28 20:07:02