我正在尝试根据用户在迷你博客上的帖子构建一个迷你回复系统。 每个帖子都有一个名为reply的链接。如果有人按回复,则会显示回复表单,并且会编辑回复,然后提交表单。问题是我不知道如何获取我要回复的帖子的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
答案 0 :(得分:3)
url(r'^save_reply/(?P<id>\d+)/$',
save_reply,
name='save_reply'),
(这是我在urls.py中保留的内容) 每个帖子下的回复?我的意思是,直到现在,我的回复链接只是调用函数回复/ save_reply(我有回复)但是现在,当我将id作为参数时,我怎么能把它放在我的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/(例如) 当然,我已经删除了我的外键字段,因为现在它是不必要的
谢谢!
答案 1 :(得分:1)
您需要在表单中使用隐藏字段来捕获与评论相关的新实例的PK。
由于您使用的是ModelForm,因此您的回复模型已建立了ForiegnKey关系。您可以将widget类型设置为隐藏,以便您的用户看不到它..
# forms.py
class ReplyForm(ModelForm):
class Meta:
model = Reply
fields = ['reply', 'reply_to']
widgets = {
'reply_to': forms.HiddenInput),
}
初始化ReplyForm时,您可以填充answer_to字段,例如form = ReplyForm({'reply_to': new.pk})
- 其中new
是新实例
顺便说一下,您可以考虑将New
模型的名称更改为Post
。 “新”有点难以谈论,而且有点令人困惑,因为“新”通常意味着在编程环境中完全不同。
答案 2 :(得分:1)
如果按下回复,则会显示回复表单,
我认为这是你需要做的工作。当呈现回复表单时,它需要具有回复它的帖子的ID(新的实例)。这可能是必须通过请求,除非你有其他方法来跟踪它?
有些事情:
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-&GT; 渲染帖子 --post_id-&gt; 呈现回复表单 --post_id-&gt; 商店回复