簡體   English   中英

Django Model Mixins-字段排序

[英]Django Model Mixins - Fields Ordering

我目前正在試驗模型混合器,其想法是建立一個包含小型抽象混合器類的小型庫,以定義常用字段。

這是我目前正在玩的游戲:

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”字段都會始終顯示在最前面。 它們被組合在一起(由於它們屬於同一類,因此看起來很合理),但是我似乎無法以這種方式強制排序。

我知道這是一個微不足道的問題-我可以通過管理字段集解決此問題,無論如何,這將變得更加靈活。 這似乎是我希望可以使用的便捷技巧,所以我只是想了解為什么不起作用。

(此外,如果有人對模型混合模塊有任何一般性建議,我都會聽到-我已經找到了一些信息,但數量不多,而google for django models mixins Google往往會返回很多有關CBV混合模塊的結果,我目前感興趣的是什么。

感謝所有願意回答的人!

這不能回答您的問題,但我確實認為該方法確實不錯。

在Django模型中重新排序字段

對於表格:

Django如何知道呈現表單字段的順序?

不必在每次向Model類添加新字段時都使用表單中的fields屬性來進行編輯,而是創建邏輯以將異常添加到所需的位置。

另一種方法:您可以from django.forms import fields_for_model使用from django.forms import fields_for_model ,並使用此函數創建一個函數來填充您的fields屬性。 檢查此方法文檔 ,真的很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM