Tôi muốn mở rộng câu trả lời của Carl Meyer, câu trả lời hoạt động hoàn hảo cho đến ngày nay.
Tôi luôn sử dụng TextField
thay vì CharField
(có hoặc không có lựa chọn) và áp đặt giới hạn ký tự ở phía UI / API hơn là ở cấp DB. Để làm cho điều này hoạt động động:
from django import forms
from django.contrib import admin
class BaseAdmin(admin.ModelAdmin):
"""
Base admin capable of forcing widget conversion
"""
def formfield_for_dbfield(self, db_field, **kwargs):
formfield = super(BaseAdmin, self).formfield_for_dbfield(
db_field, **kwargs)
display_as_charfield = getattr(self, 'display_as_charfield', [])
display_as_choicefield = getattr(self, 'display_as_choicefield', [])
if db_field.name in display_as_charfield:
formfield.widget = forms.TextInput(attrs=formfield.widget.attrs)
elif db_field.name in display_as_choicefield:
formfield.widget = forms.Select(choices=formfield.choices,
attrs=formfield.widget.attrs)
return formfield
Tôi có một tên mô hình Post
ở đâu title
, slug
& state
là TextField
s và state
có các lựa chọn. Định nghĩa quản trị có dạng như sau:
@admin.register(Post)
class PostAdmin(BaseAdmin):
list_display = ('pk', 'title', 'author', 'org', 'state', 'created',)
search_fields = [
'title',
'author__username',
]
display_as_charfield = ['title', 'slug']
display_as_choicefield = ['state']
Nghĩ rằng những người khác đang tìm kiếm câu trả lời có thể thấy điều này hữu ích.