如何向Django管理字段添加占位符文本

2024-06-16 09:05:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将占位符文本添加到Django管理更改表单中的字段。在常规的ModelForm中,您可以通过重写字段的小部件或修改ModelForm __init__()方法中的self.fields['my_field'].widget来实现这一点。我如何为Django管理员做类似的事情?在


Tags: django方法文本self表单fieldfieldsinit
3条回答

重写ModelAdmin上的render_change_form()方法,该方法提供对表单实例的访问:

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)

对于其他字段属性,如autocompleteautofocusminmaxrequiredtype或{}等属性,这种方法是相同的。您还可以访问提供模型实例的context["original"],以防您想根据模型实例更改行为。在

源代码是最好的参考: https://docs.djangoproject.com/en/2.2/_modules/django/contrib/admin/options/#ModelAdmin

有文档记录的方法是重写^{}

The base implementation uses modelform_factory() to subclass form, modified by attributes such as fields and exclude.

如果您查看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的子类):

^{pr2}$

这是一种无需手动向每个字段添加占位符文本的方法:

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)

相关问题 更多 >