如何将占位符文本添加到Django Admin字段

时间:2019-10-03 07:32:34

标签: python django

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

4 个答案:

答案 0 :(得分:0)

在您的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)

对于其他字段属性,例如autocompleteautofocusminmaxrequired,{{1} }或type。您还可以访问提供模型实例的pattern,以防您想根据模型实例更改行为。

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

答案 1 :(得分:0)

记录的方法是覆盖get_form()

  

基本实现使用modelform_factory()来继承表单,   被字段排除之类的属性修改。

如果查看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': ...})

答案 2 :(得分:0)

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

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)

答案 3 :(得分:0)

另一种方法是:

class MyModelAdmin(model.ModelAdmin):   
    def get_form(self, request, obj=None, **kwargs):
     #--> Get form 
        form = super().get_form(request, obj, **kwargs)
     #--> Add placeholder for field
        form.base_fields['the_field_name'].widget.attrs['placeholder'] = "My_Place_Holder_Text"
     #--> Return form
        return form
    #---
#---

这类似于dirkgroten的答案。这样做的好处是,无需担心用于该字段的小部件。