0

フィールドのあるモデルがあります:

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)

そして、そこから複数の選択フィールド(チェックボックスではない)を取得する必要があります。

私が見つけた1つの方法は、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)

ただし、フィールドごとに「ラベル」と「初期」を再宣言する必要があります。これは、DRYの原則には適していません。そして、私は理解していません、どうすれば各フィールドの初期値にオブジェクトの現在の値を設定できますか?

そして他の方法で、私がマニュアルで見つけたのはフォームフィールドオーバーライドです。トランクから開発バージョンを使用し、このコードを使用しようとしましたが、管理インターフェイスで選択フィールドが複数選択に変更されませんでした。

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

誰もが知っているかもしれませんが、複数の選択フィールドを定義するための最良の方法は何ですか?ありがとう!

4

3 に答える 3

1

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トランクでうまく機能する

于 2010-04-20T08:16:08.837 に答える
1

models.CommaSeparatedIntegerField を forms.SelectMultiple として作成するための有効な答えが見つかりません。そこで、models.CommaSeparatedIntegerField を models.ManyToManyField に変更すると、フォーム フィールドが非常にうまく機能するようになりました。このフィールドに対してクエリを実行する必要がある場合に適しています。

于 2009-04-28T08:51:00.987 に答える
0

私はやや DRYer なフォーム操作のために以下を使用しています。これは 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.
于 2009-04-07T13:42:13.403 に答える