web-dev-qa-db-ja.com

Django Admin-カスタムフォームフィールドのウィジェットのオーバーライド

カスタムのTagFieldフォームフィールドがあります。

class TagField(forms.CharField):
    def __init__(self, *args, **kwargs):
        super(TagField, self).__init__(*args, **kwargs)
        self.widget = forms.TextInput(attrs={'class':'tag_field'})

上記のように、TextInputフォームフィールドウィジェットを使用しています。しかし、管理者では、Textareaウィジェットを使用して表示したいと思います。このため、formfield_overridesフックですが、この場合は機能しません。

管理宣言は次のとおりです。

class ProductAdmin(admin.ModelAdmin):
    ...
    formfield_overrides = {
        TagField: {'widget': admin.widgets.AdminTextareaWidget},
    }

これはフォームフィールドウィジェットには影響せず、tagsは引き続きTextInputウィジェットでレンダリングされます。

どんな助けでも大歓迎です。

-
オマト

31
onurmatik

Django adminは、そのフィールドの多くにカスタムウィジェットを使用します。フィールドをオーバーライドする方法は、ModelAdminオブジェクトで使用するフォームを作成することです。

# forms.py

from Django import forms
from Django.contrib import admin

class ProductAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ProductAdminForm, self).__init__(*args, **kwargs)
        self.fields['tags'].widget = admin.widgets.AdminTextareaWidget()

次に、ModelAdminオブジェクトでフォームを指定します。

from Django.contrib import admin
from models import Product
from forms import ProductAdminForm

class ProductAdmin(admin.ModelAdmin):
    form = ProductAdminForm

admin.site.register(Product, ProductAdmin)

この時点でクエリセットをオーバーライドすることもできます。たとえば、モデルの別のフィールドに従ってオブジェクトをフィルタリングします(たとえば、limit_choices_toはこれを処理できません)

45

Django 1.2:

class ProductAdminForm(forms.ModelForm):
    class Meta:
        model = Product
        widgets = {
            'tags': admin.widgets.AdminTextareaWidget
        }

class ProductAdmin(admin.ModelAdmin):
    form = ProductAdminForm

https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-fields

34
Murat Çorlu

次のようにフィールドを変更してみてください:

class TagField(forms.CharField):
    def __init__(self, *args, **kwargs):
        self.widget = forms.TextInput(attrs={'class':'tag_field'})
        super(TagField, self).__init__(*args, **kwargs)

これにより、**kwargsのウィジェットを使用できるようになります。それ以外の場合、フィールドは常にform.TextInputウィジェットを使用します。

2
Andrey Fedoseev

私が使用する一種のフィールドではない特定のフィールドについて:

Django 2.1.7

class ProjectAdminForm(forms.ModelForm):
    class Meta:
        model = Project
        fields = '__all__'
        widgets = {
            'project_description': forms.Textarea(attrs={'cols': 98})
        }
class ProjectAdmin(admin.ModelAdmin):
    form = ProjectAdminForm

ありがとう、@ MuratÇorlu

0
C.K.