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. Но в admin я бы хотел, чтобы он отображался с помощью виджета Textarea. Для этого есть крючок formfield_overrides
, но он не работает для этого случая.
Объявление администратора:
class ProductAdmin(admin.ModelAdmin):
...
formfield_overrides = {
TagField: {'widget': admin.widgets.AdminTextareaWidget},
}
Это не влияет на виджет поля формы, а tags
все еще отображается с помощью виджета TextInput.
Любая помощь очень ценится.
- Страница OMAT
Ответы
Ответ 1
Администратор django использует пользовательские виджеты для многих своих полей. Способ переопределения полей - создать форму для использования с объектом 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
не может справиться с этим)
Ответ 2
Вы можете переопределить виджеты полей, расширив класс ModelForm Meta с 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
Ответ 3
Попробуйте изменить поле следующим образом:
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
.
Ответ 4
Для конкретного поля, а не поля, которые я использую:
Джанго 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