如果不用JS和CSS,只用Django的admin如何实现?
时间: 2024-03-27 13:40:30 浏览: 108
Django Admin实现三级联动的示例代码(省市区)
如果您想在 Django admin 中将错误信息显示在输入框附近,可以使用 Django 的自定义表单和模板标签来实现。具体步骤如下:
1. 创建一个自定义表单,在其中重写 clean() 方法,以便在验证失败时将错误信息添加到输入框附近的标签中。例如:
```python
from django import forms
class MyForm(forms.Form):
my_field = forms.CharField()
def clean_my_field(self):
data = self.cleaned_data["my_field"]
if not data.startswith("hello"):
raise forms.ValidationError("必须以 'hello' 开头")
return data
```
2. 创建一个自定义模板标签,在其中渲染错误信息的容器,并将其插入到输入框附近的位置。例如:
```python
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
@register.simple_tag
def error_message_for_field(field):
if field.errors:
error_message = mark_safe("<div class='error-message'>%s</div>" % field.errors.as_ul())
return mark_safe("%s %s" % (str(field), error_message))
else:
return str(field)
```
3. 在 Django admin 中使用自定义表单和自定义模板标签。例如:
```python
from django.contrib import admin
from .forms import MyForm
from .templatetags.my_tags import error_message_for_field
class MyModelAdmin(admin.ModelAdmin):
form = MyForm
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
for field_name, field in form.base_fields.items():
field.widget = forms.TextInput(attrs={
"class": "input-text",
"placeholder": field.label,
})
return form
def formfield_for_dbfield(self, db_field, **kwargs):
formfield = super().formfield_for_dbfield(db_field, **kwargs)
if formfield.widget.__class__.__name__ == "TextInput":
formfield.widget.render = error_message_for_field
return formfield
admin.site.register(MyModel, MyModelAdmin)
```
这样,当验证失败时,错误信息将显示在输入框附近的标签中。您可以根据需要自定义容器的样式和位置。
阅读全文