2013-10-10 3 views
1

В настоящее время я экспериментирую с модельными миксинами, идея состоит в том, чтобы создать небольшую библиотеку небольших абстрактных классов mixin, определяющих часто требуемые поля.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_classes, target_blank & title полей, которые будут перечислены после label & url в сайте администратора, и наоборот, если я инвертировать порядок двух Mixins в декларации.

Но независимо от того, как я перечисляю mixins, поля «html_attrs» продолжают отображаться первыми. Они группируются вместе (что кажется логичным, поскольку они принадлежат к одному классу), но я просто не могу заставить заставить упорядочить таким образом.

Я знаю, что это тривиальный вопрос - я могу исправить это с помощью набора полей admin, который в любом случае окажется более гибким. Это просто показалось удобной трюк, которую я ожидал работать, поэтому мне просто интересно понять, почему это не так.

(Кроме того, если у кого-нибудь есть какие-либо советы по модели mixins в целом, я все уши - я нашел некоторую информацию, но не очень, а google для django models mixins имеет тенденцию возвращать много результатов о CBV mixins, что в настоящее время это не то, что меня интересует).

Спасибо всем, кто захочет ответить!

ответ

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, это действительно приятно!