Django后台中CITextField显示为文本域而非单行输入框的解决方法
解决Django Admin中CITextField显示为多行文本域的问题
Django默认会给CITextField分配TextareaWidget,这就是为什么即使设置了max_length,它在admin后台还是显示为多行文本域,而CharField默认用的是TextInput(单行输入框)。可以通过以下两种方式修正:
方法1:在Admin类中全局指定CITextField的Widget
在admin.py中导入所需模块,然后在对应的ModelAdmin类里配置formfield_overrides:
from django.contrib import admin from django.contrib.postgres.fields import CITextField from django.forms import TextInput from .models import Country class CountryAdmin(admin.ModelAdmin): formfield_overrides = { CITextField: {'widget': TextInput}, } admin.site.register(Country, CountryAdmin)
这样所有模型中的CITextField在admin后台都会显示为单行输入框,并且会遵守max_length的限制。
方法2:自定义单行版CITextField字段
如果项目中有大量CITextField需要单行显示,可以自定义一个继承自CITextField的字段,默认绑定TextInput:
在models.py中添加自定义字段:
from django.contrib.postgres.fields import CITextField from django.forms import TextInput class SingleLineCITextField(CITextField): def formfield(self, **kwargs): defaults = {'widget': TextInput} defaults.update(kwargs) return super().formfield(**defaults)
然后在模型中使用这个自定义字段替代原生CITextField:
class Country(models.Model): class Meta: verbose_name_plural = "Countries" name_en = models.CharField(unique=True, verbose_name="English Country Name", max_length=100) name_fr = SingleLineCITextField(unique=True, verbose_name="French Country Name", max_length=100) name_he = SingleLineCITextField(unique=True, verbose_name="Hebrew Country Name", max_length=100)
这种方式一劳永逸,后续新增的同类型字段都会自动使用单行输入框。
内容的提问来源于stack exchange,提问作者ufk
相关产品推荐
相关产品推荐

