Django:在ModelForm的save()方法中保存到多对多字段?

时间:2010-07-14 12:37:16

标签: python django

我正在Django中编写一个webblog应用程序。我目前有2款Post和PostMeta。 Post是一个标准的帖子风格模型,包含作者,标题,内容等字段。它还包含一个名为post_meta的多对多字段,它与我的第二个模型PostMeta相关联。 PostMeta是一个简单的名称/值模型,包含两个字段,meta_key和meta_value。

我要做的是在管理界面中自定义Post模型的表单以使其更直观。具体来说,我想抽象出PostMeta关联的创建,而不是看到默认情况下为admin管理的非直观选择框。我想改为显示一个文本字段来代替此选择框,用户可以在其中输入与帖子关联的逗号分隔的标签列表。提交表单时,我想将标记字段的输入拆分为单个标记,并将每个标记保存为PostMeta,其中meta_key将设置为“TAG”,meta_value将是逗号分隔的字符串之一。

我遇到的问题是我似乎无法正确保存。我不确定我的语法是否有问题(我对python很新)或者我还有其他需要做的事情,我可能已经错过了。这是我的admin.py的一小部分:

class PostAdminForm(forms.ModelForm):
    tags = forms.CharField(max_length=200)
    class Meta:
        model = Post
    def save(self, commit=True):
        model = super(PostAdminForm, self).save(commit=False)
        if commit:
            model.save()
            splitTags = self.cleaned_data['tags'].split(',')
            for tag in splitTags:
                pm = PostMeta(meta_key="TAG", meta_value=tag)
                pm.save()
                model.post_meta.add(pm)
        return model

class PostAdmin(admin.ModelAdmin):
    model = Post
    form = PostAdminForm

admin.site.register(Post, PostAdmin)

关于如何完成这项工作的任何建议或建议都会很棒。还在学习:\

1 个答案:

答案 0 :(得分:2)

代码中最直接的问题是,当Django管理员调用save()方法时,commit参数几乎总是False。但是,如果您只是忽略commit的值,则无法对新创建的Post执行model.post_meta.add(pm),因为该模型尚未在数据库中创建(因此无法在{ {1}}到Post m2m表)。

请参阅my answer to a different post,我认为这也适用于您的情况,并且有相当多的代码可供您使用。