我目前正在試驗模型mixin,這個想法是構建一個定義常用字段的小型抽象混合類的小型庫。Django Model Mixins - 字段排序
這裏就是我目前正在播放:
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會通過按列出順序遍歷基類來解析屬性名稱,所以在上面例如,我希望見到的後的管理站點label
& url
列出的css_classes
,target_blank
& title
領域,反之亦然,如果我在反轉申報兩個混入的順序。
但是,無論我如何列出mixins,「html_attrs」字段都會先出現。他們被分組在一起(這看起來合乎邏輯,因爲他們屬於同一個班級),但我似乎無法以這種方式強制排序。
我知道這是一個微不足道的問題 - 我可以用管理員字段集來解決這個問題,無論如何,這將證明更靈活。這只是我期望能夠工作的一種方便的技巧,所以我只是想了解爲什麼它沒有。 (另外,如果任何人有任何關於模型mixin的一般建議,我全部耳朵 - 我已經找到了一些信息,但不多,谷歌django models mixins
傾向於返回關於CBV mixin的大量結果,其中這不是我目前感興趣的)。
感謝任何會照顧回答的人!