内联编辑与模型相关的所有ForeignKey [django admin]

时间:2015-08-18 07:04:42

标签: python django django-admin

django可以在其父内联中显示ForeignKey。[refer]
我所需要的是完全颠倒的。

我的网站中有一个导航栏,我只需要一个Menu模型来控制导航栏下的MenuButtons的名称和网址。子MenuButton的数量固定为4(将来不会改变)。
因此,设计我的菜单模型的最简单和正确的方法如下:

class MenuButton(models.Model):
    class Meta:
        verbose_name = u"菜单按钮"
        verbose_name_plural = u"菜单按钮"

    name = models.CharField(u'名字', max_length=8)
    url = models.CharField(u'链接', max_length=100)
    priority = models.IntegerField(u'排序优先级', null=True, blank=True)
    create_time = models.DateTimeField(u'创建时间', auto_now_add=True)
    update_time = models.DateTimeField(u'更新时间', auto_now=True)

    def __unicode__(self):
        return self.name


class Menu(models.Model):
    class Meta:
        verbose_name = u"菜单"
        verbose_name_plural = u"菜单"

    button_1 = models.ForeignKey(MenuButton, verbose_name=u'按钮1', related_name="button_1")
    button_2 = models.ForeignKey(MenuButton, verbose_name=u'按钮2', related_name="button_2")
    button_3 = models.ForeignKey(MenuButton, verbose_name=u'按钮3', related_name="button_3")
    button_4 = models.ForeignKey(MenuButton, verbose_name=u'按钮4', related_name="button_4")

我只想让管理员显示一个菜单。人们只能更改MenuAdmin编辑表单中的四个按钮,既不删除也不添加新按钮。但我无法找到构建自定义字段的方法。

1 个答案:

答案 0 :(得分:1)

设计错了。 2解决方案来解决这个问题:

  1. 在MenuButton中使用普通外键并以其他方式限制按钮数量(更好的解决方案)
  2. 用户OneToOneFields而不是外键(不如第一次好,稍后解释)
  3. 当使用第一个解决方案时,您可以限制并确保您的管理员(或视图,如果您允许在管理员之外编辑它)中始终有4个且仅有4个按钮。您可以为内联管理员提供max_nummin_num属性。您还可以覆盖has_add_permission和has_delete_permission以删除管理员中的所有功能,在所有情况下都返回false。

    使用第二个解决方案时,您也可以这样做,但获取所有按钮的查询将更复杂且不太理想。所以你应该坚持第一次设计。