我想将占位符文本添加到 Django 管理更改表单中的字段中。在常规 ModelForm 中,您可以通过覆盖字段的小部件或修改 ModelForm
self.fields['my_field'].widget
方法中的 __init__()
来完成此操作。我如何为 Django 管理员做类似的事情?
get_form()
:
基本实现使用
来子类化表单, 由 fields 和 exclude 等属性修改。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': ...})
覆盖 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
这是一种无需手动向每个字段添加占位符文本的方法:
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)
另一种方法是:
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的回答类似。这里的优点是无需担心用于该字段的小部件。
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