django 我无法用 2 个外键保存表单

Posted

技术标签:

【中文标题】django 我无法用 2 个外键保存表单【英文标题】:django i can't save form with 2 foreign keys 【发布时间】:2011-02-24 09:29:47 【问题描述】:

我有一个回复类:

class Reply(models.Model):
    reply_to = models.ForeignKey(New)
    creator = models.ForeignKey(User)
    reply = models.CharField(max_length=140,blank=False)

重播表格:

class ReplyForm(ModelForm):
class Meta:
      model = Reply
      fields = ['reply']

其中 New 是 Post 类(包含用户的帖子) 和一个视图

def save_reply(request):
   #u = New.objects.get(pk=id)
if request.method == 'POST':

    form = ReplyForm(request.POST)
    if form.is_valid():
       new_obj = form.save(commit=False)
       new_obj.creator = request.user
       new_obj.reply_to = form.reply_to
     #  reply_to_id = u
       new_post = New(2) #this works hardcoded, but how can i get the blog New post #id, as a parameter, instead?
       new_obj.reply_to = new_post
       new_obj.save()
       return HttpResponseRedirect('.')    

其他: 表单 = 回复表单() return render_to_response('replies/replies.html', “形式”:形式, , context_instance=RequestContext(request))

其中 created_by 属于 New 类,代表帖子的创建者(待回复)

如何将当前帖子分配给它下的回复?

提前致谢!

【问题讨论】:

【参考方案1】:

我可能遗漏了一些东西,但reply_to 需要一个新模型的实例。 New.id 在我看来不像?

new_obj.reply_to = New.id

您是否有一个可以分配的新模型实例?

啊,我看到你已经调整了问题

如果您没有 New 模型的实例,则需要创建一个

new_post = New(whatever, goes, here)
new_post.save()

然后分配给reply_to

new_obj.reply_to = new_post

或类似的。

编辑

在不确切知道ReplyForm 的情况下,我猜测了一下,但大概是基于Reply 对象,让用户以某种方式选择reply_to 字段?

假设表单的 reply_to 变量已填充且正确,我认为您应该能够做到:

form = ReplyForm(request.POST)
if form.is_valid():
   new_obj = form.save(commit=False)
   new_obj.creator = request.user
   new_obj.reply_to = form.reply_to
   new_obj.save()

事实上,既然是外键,new_obj = form.save(commit=False) 可能已经为你设置了 .reply_to 了? Django Model Forms 文档可能会有所帮助。

【讨论】:

是的:) 它工作,硬编码我的意思是:new_obj.creator = request.user new_post = New(1) new_obj.reply_to = new_post new_obj.save() 但我不知道如何将 messageId(来自新模型)传递给回复。我尝试使用 u = New.objects.get(pk=id) 和 New(u),但没有结果。 我已编辑,添加了我的回复表单。它不像上面那样工作,它说:'ReplyForm'对象没有属性'reply_to',因为reply_to是New的外键,即包含用户帖子的表 对。如果我明白了,那么我认为您遇到的问题是您无法识别正在回复的帖子(新实例)?可能有不同的方法来处理它,但我想把它放在表格中会最简单。我想最后一篇文章可以改为进入用户的会话或类似内容,但这对我来说似乎更令人费解。您需要 1. 确定正在回复的帖子,2. 从数据库中查找该对象并 3. 将其分配给 new_obj.reply_to ... 这一切都取决于您的应用程序 是的:) 就是这样。我所需要的只是一个正在回答的帖子的“id”,当然,当一个人按下回复按钮(链接)时,这是一种获取方式。我想我已经接近了,但仍然想念一些东西,我会想更多:)【参考方案2】:

不确定这是否适合您的应用,但您可以尝试使用 form widget,特别是 HiddenInput 以在表单中包含帖子 (id)。像

class ReplyForm(ModelForm):
    reply_to = forms.ModelChoiceField(New.objects.all(), widget=forms.HiddenField)
    class Meta:
        model = Reply
        fields = ['reply', 'reply_to']
        widgets = 
           'reply_to': HiddenField,
        

(不确定这是否完全正确,但请参阅overriding-the-default-field-types-or-widgets 了解更多信息)。

您现在已经启用了需要传递给客户端并通过表单返回的 id,现在您只需在创建表单以首先显示时将其放入

else: 
    form = ReplyForm()
    form.reply_to = # ... fill in the current post (New inst) being replied to
    # presumably from somewhere in the request object?
    return render_to_response('replies/replies.html',  'form': form, , 

希望这不会导致您走上错误的道路 - 完全未经测试、E&OE、YMMV 等,等等

【讨论】:

嗯……还是不行。我在这里的另一个问题中重新表述了它:***.com/questions/2923607/django-blog-reply-system 谢谢:)

以上是关于django 我无法用 2 个外键保存表单的主要内容,如果未能解决你的问题,请参考以下文章

Django Createview根据外键的id保存表单并重定向到页面

Django:使用外键保存动态表单

使用外键链接保存模型表单时,Django 'ManagementForm 数据丢失或已被篡改'

在 Django 中使用自定义外键字段保存表单中的数据

django:如何从包含外键的多个模型中制作一个表单

如何设置模型实例以在Django中生成确认表单