【问题标题】:Django - Custom admin save modelDjango - 自定义管理员保存模型
【发布时间】:2014-07-11 08:33:43
【问题描述】:

我有两个模型:Page 和一个自定义用户模型 MyUser

这两个模型各有一个manytomanyfield:

class Page(models.Model):
    members = models.ManyToManyField(settings.AUTH_USER_MODEL)

class MyUser(AbstractUser):
    mypages = models.ManyToManyField(Page)
    objects = UserManager()

当我通过管理界面将成员添加到 members manytomanyfield 时,我想在 mypages 属性中自动将新的属性 Page 对象添加到用户,所以我试图覆盖的保存方法admin.py 中的 Page 模型:

class PageAdmin(admin.ModelAdmin):
    def save_related(self, request, form, formsets, change):
        super(ModelAdmin, self).save_related(request, form, formsets, change)
        if 'members' in form.changed_data:
        #And I am quite lost....

这是个好主意吗?我是否应该在models.py 文件中的“页面模型自定义保存”方法中执行此操作,或者在admin.py 中执行此操作?

我尝试用以下想法替换 #And I am quite lost.... 部分:
Link1
Link2

没有任何成功!

【问题讨论】:

    标签: python django django-admin save many-to-many


    【解决方案1】:

    这是完全错误的。多对多字段已经是双端的。您不需要在两端都定义它。当您在Page 上定义members 字段时,MyUser 将自动获得一个page_set 访问器,它是关系的另一端,并且任何将用户添加到其成员的页面都将自动显示在用户的 page_set。不需要任何代码。

    【讨论】:

    • 也许我理解错了,但我没有那样的东西。当我将新的member 对象添加到page 对象的members 多对多字段时,用户的多对多mypages 属性未填充页面对象! :$
    • 也许我不够清楚:您应该根本不定义 mypages 字段。反向访问器称为page_set,它是自动定义的。
    • 我刚刚意识到我不了解多对多字段的使用。谢谢你。顺便说一句,我要编辑我的问题并模拟这个错误,还是删除整个线程更好?
    • 不,不要删除问题,它可能会帮助其他人。
    猜你喜欢
    • 2011-03-30
    • 2016-03-01
    • 2011-10-12
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多