2013-10-10 86 views
1

我目前正在試驗模型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_classestarget_blank & title領域,反之亦然,如果我在反轉申報兩個混入的順序。

但是,無論我如何列出mixins,「html_attrs」字段都會先出現。他們被分組在一起(這看起來合乎邏輯,因爲他們屬於同一個班級),但我似乎無法以這種方式強制排序。

我知道這是一個微不足道的問題 - 我可以用管理員字段集來解決這個問題,無論如何,這將證明更靈活。這只是我期望能夠工作的一種方便的技巧,所以我只是想了解爲什麼它沒有。 (另外,如果任何人有任何關於模型mixin的一般建議,我全部耳朵 - 我已經找到了一些信息,但不多,谷歌django models mixins傾向於返回關於CBV mixin的大量結果,其中這不是我目前感興趣的)。

感謝任何會照顧回答的人!

回答

0

這並不回答你的問題,但我確實認爲這種方法非常好。

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,真的很好!