【问题标题】:django i can't save form with 2 foreign keysdjango 我无法用 2 个外键保存表单
【发布时间】: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 类,代表帖子的创建者(待回复)

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

提前致谢!

【问题讨论】:

    标签: database django forms foreign-keys


    【解决方案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 等,等等

    【讨论】:

    猜你喜欢
    • 2013-10-02
    • 2012-03-14
    • 2013-10-11
    • 1970-01-01
    • 2022-01-22
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多