forms.SelectMultiple из моделей. CommaSeparatedIntegerField - PullRequest
0 голосов
/ 07 апреля 2009

У меня есть модель с полем:

class Movie(models.Model):
    genre = models.CommaSeparatedIntegerField(max_length=100, choices=GENRE_CHOICES, blank=True, default=0)
    lang = models.CommaSeparatedIntegerField(max_length=100, choices=LANG_CHOICES, blank=True, default=0)

И мне нужно получить несколько полей выбора (не флажки) из этого.

Один из найденных способов - переопределить форму из ModelAdmin

.
class MyMovieAdminForm(forms.ModelForm):
    genre = forms.MultipleChoiceField(choices=GENRE_CHOICES)
    lang = forms.MultipleChoiceField(choices=LANG_CHOICES)

class MovieAdmin(admin.ModelAdmin):
    form = MyMovieAdminForm

admin.site.register(Movie, MovieAdmin)

Но для каждого поля необходимо переопределить 'label' и 'initial', что плохо для принципа DRY. И я не понимаю, как мне установить текущее значение объекта для начального значения каждого поля?

И другой способ, который я нашел в руководстве, это formfield-overrides . Я использую версию dev из trunk и пытаюсь использовать этот код, но он не изменил мои выбранные поля для множественного выбора в интерфейсе администратора:

class MovieAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.CommaSeparatedIntegerField: {'widget': forms.SelectMultiple},
    }

Может быть, кто-нибудь знает, каков наилучший способ определения нескольких полей выбора? Спасибо!

Ответы [ 3 ]

1 голос
/ 28 апреля 2009

Я не нахожу никакого рабочего ответа для создания моделей. CommaSeparatedIntegerField как forms.SelectMultiple. Поэтому я изменил модели. CommaSeparatedIntegerField для моделей. ManyToManyField и поле формы становится очень хорошо работает! Это больше подходит в тех случаях, когда вам нужно сделать запрос в этом поле.

1 голос
/ 20 апреля 2010

1) Удалить выбор из моделей. CommaSeparatedIntegerField в моделях

2) Создать CommaSeparatedCharField в качестве замены

class CommaSeparatedCharField(forms.CharField):
    def to_python(self, value):
        if value in validators.EMPTY_VALUES:
            return u''
        csv = smart_unicode(','.join(value) )
        return csv   

class CommaSeparatedSelectMultiple(forms.SelectMultiple):
    def render(self, *args, **kwargs):
        print args, kwargs
        args_=list(args)
        if type(args_[1])!=list:
            args_[1] = args_[1].split(',')
        return super(CommaSeparatedSelectMultiple, self).render(*args_, **kwargs)

3) Применить

class MyAdmin(admin.ModelAdmin):
    class form(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(forms.ModelForm, self).__init__(*args, **kwargs)
            for field_name, choices in [
                ('minutes', [(i,str(i)) for i in range(60)]),
            ]:
                self.fields[field_name] = CommaSeparatedCharField(
                    label=self.fields[field_name].label,
                    initial=self.fields[field_name].initial,
                    widget=forms.CommaSeparatedSelectMultiple(choices=choices)
                )

Хорошо работает на 1,2 багажнике

0 голосов
/ 07 апреля 2009

Я использую следующее для несколько более сухих манипуляций с формой, и это работает с 1.0 Это многословно, но работает.

class MyMovieAdminForm(forms.ModelForm):
    ## Meta, etc

    def __init__(self, *args, **kwargs):
        super(MyMovieAdminForm, self).__init__(*args, **kwargs)
        self.fields["genre"].widget = forms.SelectMultiple(choices=foo)
        self.fields["genre"].initial = self.instance.genre
        # Doesn't require redefining label, etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...