【问题标题】:Django Model Mixins - Fields OrderingDjango 模型混合 - 字段排序
【发布时间】:2013-10-18 20:27:58
【问题描述】:

我目前正在试验模型混合,其想法是构建一个小型抽象混合类库,定义常用字段。

这是我目前正在玩的:

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_blanktitle 字段在管理站点中的 labelurl 之后列出,反之亦然,如果我在声明中颠倒两个 mixins 的顺序.

但无论我如何列出 mixins,“html_attrs”字段都会首先出现。它们组合在一起(这似乎合乎逻辑,因为它们属于同一类),但我似乎无法以这种方式强制排序。

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

(另外,如果有人对模型混合有任何建议,我会全神贯注 - 我找到了一些信息,但并不多,谷歌 django models mixins 往往会返回很多关于 CBV 混合的结果,这不是我目前感兴趣的)。

感谢任何愿意回答的人!

【问题讨论】:

    标签: python django django-models models mixins


    【解决方案1】:

    这并不能回答您的问题,但我确实认为这种方法非常好。

    Reordering fields in Django model

    对于表格:

    How does Django Know the Order to Render Form Fields?

    每次向模型类添加新字段时,不要在表单中使用 fields 属性进行编辑,而是创建一个逻辑以在所需的位置添加异常。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2015-02-18
      • 1970-01-01
      • 2021-11-06
      • 2015-08-31
      • 1970-01-01
      相关资源
      最近更新 更多