현재까지 완벽하게 작동하는 Carl Meyer의 답변을 확장하고 싶었습니다.
나는 항상 (선택의 유무에 관계없이) TextField
대신 사용 CharField
하고 DB 수준이 아닌 UI / API 측에 문자 제한을 부과합니다. 이 작업을 동적으로 수행하려면 다음을 수행하십시오.
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
나는 모델 이름이 Post
어디에서 title
, slug
및 state
있습니다 TextField
들과 state
선택이있다. 관리자 정의는 다음과 같습니다.
@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']
답을 찾는 다른 사람들이 이것이 유용하다고 생각했습니다.