Подтвердить что ты не робот

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

4b9b3361

Ответ 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 не может справиться с этим)

Ответ 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