Джанго формы - PullRequest
       20

Джанго формы

2 голосов
/ 09 марта 2009

Я задал вопрос, касающийся этого. Но я думаю, что было бы лучше задать мой вопрос напрямую. У меня есть таблица «Пользователь» с множеством взаимосвязей с двумя другими таблицами «Домен» и «Группы». Таким образом, в интерфейсе администратора я вижу группы и домены как 2 ModelMultipleChoiceFields. Но я хочу представить их на пользовательском интерфейсе в более удобной форме. Я хотел бы показать каждый доступный выбор в домене и группе с флажком, который выбран / не выбран в зависимости от свойств пользователя. Интересно, могу ли я сделать это в админке или мне нужно написать свое собственное мнение независимо от админа.

Ответы [ 5 ]

2 голосов
/ 10 марта 2009

Ну, если быть точным, это виджет, который Django Admin выбирает для отображения в случае ManyToManyField. Вот в этом случае его виджет SelectMultiple, который вы считаете, менее удобен для пользователя.

Что ж, проще всего, вы всегда можете выбрать виджет, используя свой собственный ModelForm. Но в случае, если вы хотите, чтобы в Django Admin вам понадобилось туда и обратно. Проверьте это.

from django.forms import widgets
from django.contrib import admin

class MyModelAdmin(admin.ModelAdmin):
    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
    """
    Get a form Field for a ManyToManyField.
    """
    # If it uses an intermediary model, don't show field in admin.
    if db_field.rel.through is not None:
        return None

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

    return db_field.formfield(**kwargs)

Теперь определите вашего обычного администратора в admin.py как

class SomeModelAdmin(MyModelAdmin):
    search_fields = ['foo', 'bar']
    list_display   = ('foo',)
    ordering       = ('-bar',)

admin.site.register(SomeModel, SomeModelAdmin)

Теперь вы получите флажки в DJango Admin. Конечно, вам понадобятся некоторые изменения CSS.

2 голосов
/ 09 марта 2009

Я думаю, встроенный виджет CheckboxSelectMultiple делает то, что вы хотите. Если этого не произойдет, вам придется создать свой собственный виджет. Документация для виджетов - хорошее место для начала. Самый простой способ начать - скопировать существующий виджет из источника Django и изменить его.

1 голос
/ 10 марта 2009

На самом деле он использует форму модели по умолчанию в админке. Итак, вам нужно перезаписать его.

from django import forms
from django.forms import widgets

class DomainForm(forms.ModelForm):

    field2 = YourField(widget=widgets.CheckboxSelectMultiple)

    class Meta:
        model = Domain()
        fields = ('field1', 'field2')

Итак, в этом случае я переписал тип поля FIELD2 по умолчанию.

0 голосов
/ 26 ноября 2010

Вы можете изменить виджет поля интерфейса администратора django

from django.forms import widgets

class UserAdmin(admin.ModelAdmin):
    model = User

    def formfield_for_manytomany(self, db_field, request=None, **kwargs):
        if db_field.name == 'domain' or db_field.name == 'groups':
        kwargs['widget'] = widgets.CheckboxSelectMultiple()

        # or just make all the manytomany fields as checkbox

        kwargs['widget'] = widgets.CheckboxSelectMultiple()

        return db_field.formfield(**kwargs)

    # for other field
    def formfield_for_dbfield(self, db_field, **kwargs):
        .....
        return super(UserAdmin, self).formfield_for_dbfield(db_field, **kwargs)

admin.site.register(User, UserAdmin)
0 голосов
/ 09 марта 2009

Я не совсем уверен, что понимаю, что вы пытаетесь сделать, но, возможно, что-то вроде filter_hor horizontal будет делать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...