我正在尝试建立一个迷你回复系统,基于用户在微博上的帖子。每个帖子都有一个名为回复的链接。如果一个人按下回复,回复表单就会出现,一个人编辑回复,然后提交form.The问题是我不知道如何获取我想回复的帖子的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发布于 2010-05-29 04:36:02
嘿你好啊。我根据您的建议解决了这个问题,但我又创建了另一个。我在想,由于回复表单在另一个页面中,简单地点击回复链接无论如何都不会帮助我保留帖子的id,因为在我按下回复按钮之后,博客页面就消失了。因此,在我看来,我已经创建了一个函数,它将博客文章的id作为参数保存。它按应该的方式保存,没有问题,但现在我的问题是:我如何传递一个链接,比如
url(r'^save_reply/(?P<id>\d+)/$',
save_reply,
name='save_reply'), (这是我在urls.py中保存的内容)对每个帖子下面的回复?我的意思是,到目前为止,我的回复链接只是简单地调用回复/保存回复(我有回复)函数,但是现在,当我有id作为参数时,我怎么把它放在我的a 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/ (例如)当然,我已经删除了我的外键字段,因为现在它是不必要的
谢谢!
发布于 2010-05-28 05:28:17
您需要在您的表单中有一个隐藏字段,以捕获任何与注释相关的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的实例
顺便说一句,您可以考虑将New模型的名称更改为类似于Post的名称。“new”有点难说,也有点令人困惑,因为“new”在编程环境中通常意味着完全不同的东西。
发布于 2010-05-29 00:06:42
如果用户按下回复,则会出现回复表单。
我认为这是你需要努力的部分。当呈现回复表单时,它需要具有被回复的帖子的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->存储回复
https://stackoverflow.com/questions/2923607
复制相似问题