Принудительное использование filter_horizontal для переопределенных полей модели - PullRequest
1 голос
/ 22 февраля 2011

У меня есть поле модели users, но я изменил его вывод, фактически переопределив unicode :

from django import forms

class UserModelMultipleChoiceField(forms.ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return "%s, %s" % (obj.last_name, obj.first_name)

и ...

from django.contrib.admin.widgets import FilteredSelectMultiple

class ArticleAdminModelForm(BaseAdminModelForm):

    users = UserModelMultipleChoiceField(
        queryset = User.objects.order_by('last_name', 'first_name'))

    class Meta:
        model = get_model('articles', 'article')
        widgets = BaseAdminModelForm.Meta.widgets

        # Trying to force filter_horizontal -- but to no avail.
        widgets = {
            'users': FilteredSelectMultiple(
                verbose_name="users",
                is_stacked=True,
                attrs={
                    'class': 'filtered',
                })
        })

но я все еще теряю виджет filter_horizontal в админе. Кажется, что он неразрывно связан только с полями model / dbfields ... Я определил эту область в django.contrib.admin.options.py (строка 157)

def formfield_for_manytomany(self, db_field, request=None, **kwargs):
    """
    Get a form Field for a ManyToManyField.
    """
    # If it uses an intermediary model that isn't auto created, don't show
    # a field in admin.
    if not db_field.rel.through._meta.auto_created:
        return None
    db = kwargs.get('using')

    if db_field.name in self.raw_id_fields:
        kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel, using=db)
        kwargs['help_text'] = ''
    elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)):
        kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical))

Итак, как «заставить» использовать filter_horizontal для полей dmfield m2m, которые переопределены в «формах» ??

1 Ответ

1 голос
/ 18 мая 2011

Определение виджета внутри определения пользователя внутри ArticleAdminModelForm было бы способом сделать это, если бы вы использовали обычный ModelMultipleChoiceField. При создании подкласса поля python по умолчанию не вызывает его метод суперкласса init (но, возможно, за этим стоит какая-то магия django), поэтому вам может потребоваться реализовать метод init самостоятельно, так как говорит в документах .

users = forms.ModelMultipleChoiceField(
        widget=FilteredSelectMultiple(
                                      verbose_name='aktive_mitarbeiter',
                                      is_stacked=False
                                     )
        queryset=User.objects.filter(is_active=True)
        )

не проверял, работает ли это ;)

...