Как добавить заполнитель текста в поле администратора Django - PullRequest
0 голосов
/ 03 октября 2019

Я хотел бы добавить текст заполнителя в поле в форме изменения администратора Django. В обычной ModelForm вы можете сделать это, переопределив виджет поля или изменив self.fields['my_field'].widget в методе ModelForm __init__(). Как мне сделать нечто подобное для администратора Django?

Ответы [ 3 ]

0 голосов
/ 03 октября 2019

Документированный способ заключается в переопределении get_form():

Базовая реализация использует modelform_factory() для подкласса формы, модифицированной такими атрибутами, как fields и исключить .

Если вы посмотрите документы для modelform_factory , вы увидите, что вы можете передать widgetsкак kwarg . Так что это должно работать:

class MyModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        kwargs['widgets'] = {
            'name': forms.TextInput(attrs={'placeholder': 'e.g. John Doe'})
        }
        return super().get_form(request, obj, **kwargs)

или, если вы хотите быть уверены, что не переопределяете какие-либо виджеты (если вы наследуете от подкласса ModelAdmin):

 kwargs['widgets'] = kwargs.get('widgets', {})
 kwargs['widgets'].update({'name': ...})
0 голосов
/ 08 октября 2019

Это способ сделать это без необходимости вручную добавлять текст заполнителя в каждое поле:

admin.py

from django import forms


class MyModelAdmin(admin.ModelAdmin):
    def render_change_form(self, request, context, *args, **kwargs):
        form_instance = context['adminform'].form
        for key, field in form_instance.fields.items():
            if isinstance(field.widget, (forms.TextInput, forms.EmailInput)):
                field.widget.attrs.update({'placeholder': field.label})
        return super().render_change_form(request, context, *args, **kwargs)
0 голосов
/ 03 октября 2019

Переопределите метод render_change_form() в ModelAdmin, который обеспечивает доступ к экземпляру формы:

class Address(model.Model):
    street = models.CharField(max_length=50)

class AddressAdmin(admin.ModelAdmin):
    def render_change_form(self, request, context, *args, **kwargs):
        form_instance = context['adminform'].form
        form_instance.fields['street'].widget.attrs['placeholder'] = 'Your street'
        return super().render_change_form(request, context, *args, **kwargs)

Этот подход будет таким же для других атрибутов полей, таких как атрибуты, такие как autocomplete, autofocus, min, max, required, type или pattern. У вас также есть доступ к context["original"], который предоставляет экземпляр модели, на случай, если вы захотите изменить поведение в зависимости от экземпляра модели.

Исходный код является наилучшей ссылкой для этого: https://docs.djangoproject.com/en/2.2/_modules/django/contrib/admin/options/#ModelAdmin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...