Django Model Mixins - 字段排序

时间:2013-10-10 21:31:26

标签: python django django-models models mixins

我目前正在尝试使用模型mixins,其目的是构建一个小型抽象mixin类的小型库,用于定义通常需要的字段。

以下是我目前正在玩的内容:

class HtmlAttrsMixin(models.Model):

    css_classes = models.CharField(
        max_length=256,
        verbose_name=_('CSS Classes'),
        blank=True,
    )

    class Meta:
        abstract = True

class LinkHtmlAttrsMixin(HtmlAttrsMixin):

    target_blank = models.BooleanField(
        default=False,
        verbose_name=_('Open in a new window /tab'),
    )
    title = models.CharField(
        max_length=512,
        verbose_name=_('Title'),
        blank=True,
    )

    class Meta:
        abstract = True

class URLMixin(models.Model):

    label = models.CharField(
        max_length=256,
        verbose_name=_('Name'),
        blank=True,
    )
    url = models.CharField(
        max_length=4000,
        verbose_name=_('URL'),
        blank=True,
    )

    class Meta:
        abstract = True

# Concrete model implementing the above mixins:
class TagLine(URLMixin, LinkHtmlAttrsMixin):

    enabled = models.BooleanField(_("enabled"), default=True)

    def __unicode__(self):
        return self.label

到目前为止工作正常,但有一些我不太了解的事情。

我希望能够决定继承的字段'通过简单地以不同的顺序声明mixins来排序。据我所知,默认字段排序基于模型类中声明的顺序,python将通过按列出顺序遍历基类来解析属性名称,因此在上面例如,我期待css_classestarget_blank& title之后列出的label字段& {如果我在声明中颠倒了两个mixin的顺序,则在管理站点中url,反之亦然。

但无论我如何列出mixins," html_attrs"领域首先出现。它们被组合在一起(这似乎是合乎逻辑的,因为它们属于同一个类),但我似乎无法以这种方式强制排序。

我知道这是一个微不足道的问题 - 我可以用管理字段集来解决这个问题,无论如何这将更加灵活。它似乎是一个方便的技巧,我希望它能够工作,所以我只是想了解它为什么没有。

(另外,如果有人对模型混音有任何建议,我全都耳朵 - 我发现了一些信息,但并不多,而django models mixins的谷歌往往会返回很多关于CBV mixins的结果,这不是我现在感兴趣的。)

感谢任何愿意回答的人!

1 个答案:

答案 0 :(得分:0)

这并没有回答你的问题,但我认为这种方法非常好。

Reordering fields in Django model

表格:

How does Django Know the Order to Render Form Fields?

每次向Model类添加新字段时,不要在表单中使用fields属性进行编辑,而是创建一个逻辑,将异常添加到您想要的位置。

另一种方法:您可以使用from django.forms import fields_for_model,并创建一个函数来使用此函数填充fields属性。检查documentation for this method,非常好!