Django Admin - переопределение виджета настраиваемого поля формы - PullRequest
27 голосов
/ 12 августа 2010

У меня есть пользовательское поле формы 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.

Любая помощь очень ценится.

-
OMAT

Ответы [ 4 ]

45 голосов
/ 17 декабря 2010

Администратор 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 не может обработать это)

34 голосов
/ 24 апреля 2012

Вы можете переопределить виджеты полей, расширив мета-класс ModelForm начиная с 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

2 голосов
/ 12 августа 2010

Попробуйте изменить свое поле следующим образом:

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 виджет.

0 голосов
/ 12 апреля 2019

Для определенного поля я не использую поля:

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

...