カスタムの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ウィジェットでレンダリングされます。
どんな助けでも大歓迎です。
-
オマト
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
はこれを処理できません)
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
次のようにフィールドを変更してみてください:
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
ウィジェットを使用します。
私が使用する一種のフィールドではない特定のフィールドについて:
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