web-dev-qa-db-ja.com

Django:管理者:管理者のフィールドのウィジェットを変更する

そのようなブール値を持つモデルがあります:

class TagCat(models.Model):
    by_admin = models.BooleanField(default=True) 

これは管理者のチェックボックスとして表示されます。

  1. これを管理者のラジオボタンとして使用するにはどうすればよいですか?
  2. また、管理者が特定の選択した値を常に使用できるようにするにはどうすればよいですか?
  3. また、管理者以外のユーザーがTagCatを追加する場合は、デフォルト値を反対にしたいと思います。このフィールドは彼から隠されるべきです。

誰かがこれを行う方法を教えてもらえますか? Djangoドキュメンテーションはそのような詳細に行っていないようです。

25
mgPePe

更新1:1)で終了するコード(CHOICESをモデルのBooleanFieldに渡すのを忘れないでください)

from main.models import TagCat
from Django.contrib import admin
from Django import forms

class MyTagCatAdminForm(forms.ModelForm):
    class Meta:
        model = TagCat
        widgets = {
          'by_admin':forms.RadioSelect
        }

class TagCatAdmin(admin.ModelAdmin):
    form = MyTagCatAdminForm


admin.site.register(TagCat, TagCatAdmin)

ラジオボタンは見苦しく、ずれて表示されますが、少なくとも機能します

2)MyModel.pyの次の情報で解決しました:

BYADMIN_CHOICES = (
    (1, "Yes"),
    (0, "No"),
)
class TagCat(models.Model):
    by_admin = models.BooleanField(choices=BYADMIN_CHOICES,default=1)
37
mgPePe

これを行う別の方法があります。つまり、同じ型のすべてのフィールドに同じウィジェットを持たせたい場合は、IMOの方がはるかに簡単です。これは、ModelAdminにformfield_overridesを指定することによって行われます。例えば:

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.TextField: {'widget': RichTextEditorWidget},
    }

ドキュメントの詳細: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#Django.contrib.admin.ModelAdmin.formfield_overrides

更新:Django 2.0バージョンへのリンク: https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#Django.contrib.admin.ModelAdmin。 formfield_overrides

37
joshcartme

以下は、mgPePeの応答のより動的な拡張です。

class MyAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyAdminForm, self).__init__(*args, **kwargs)

        self.fields['by_admin'].label = 'My new label'
        self.fields['by_admin'].widget = forms.RadioSelect()


    class Meta:
        model = TagCat

class MyAdmin(admin.ModelAdmin):
    fields = ['name', 'by_admin']
    form = MyAdminForm

このようにして、フィールドを完全に制御できます。

10