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

问题描述 投票:0回答:5

我想将占位符文本添加到 Django 管理更改表单中的字段中。在常规 ModelForm 中,您可以通过覆盖字段的小部件或修改 ModelForm

self.fields['my_field'].widget
方法中的
__init__()
来完成此操作。我如何为 Django 管理员做类似的事情?

python django
5个回答
4
投票

记录的方法是覆盖

get_form()

基本实现使用

modelform_factory()
来子类化表单, 由 fieldsexclude 等属性修改。

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

1
投票

覆盖 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)

此方法对于其他字段属性(例如

autocomplete
autofocus
min
max
required
type
pattern
)来说是相同的。如果您想根据模型实例更改行为,您还可以访问提供模型实例的
context["original"]

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


1
投票

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

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)

1
投票

另一种方法是:

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的回答类似。这里的优点是无需担心用于该字段的小部件。


0
投票
from django import forms
from django.contrib import admin
from django.contrib.admin.helpers import ActionForm


class CustomForm(ActionForm):
    subject = forms.CharField(label='Label:', widget=admin.widgets.AdminTextInputWidget(attrs={'placeholder': 'my placeholder'}))


@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
    action_form = CustomForm
© www.soinside.com 2019 - 2024. All rights reserved.