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

标签 python django

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

我想做的是在管理界面中自定义 Post 模型的表单,使其更加直观。具体来说,我想抽象 PostMeta 关联的创建,而不是看到默认为管理员重新渲染的不直观的选择框。我想显示一个文本字段来代替此选择框,用户可以在其中输入与帖子关联的逗号分隔的标签列表。提交表单时,我想将标签字段的输入拆分为单独的标签,并将每个标签保存为 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)

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

最佳答案

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

参见my answer to a different post ,我认为这也适用于您的情况,并且有很多您可能会觉得有用的代码。

关于python - Django:保存到 ModelForm 的 save() 方法中的多对多字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3246118/

相关文章:

python - 如何更改 numpy 数组的一部分的值?

python - 最有效的 psycopg2 python 转义函数

javascript - Django、javascript 和复杂表单

python - 在 django 中将两个模型合并为一个

python - 在 Python 中从 HTML 中提取链接

python - 覆盖 DRF 中序列化程序的数据属性

python - 无法根据第一列值将列拆分为多列

python - Django Rest Framework 中的 API 查询

python - 为什么我的 Django 项目无法识别设置中安装的应用程序?

django - POST 方法总是返回 403 Forbidden