ต้องการขยายคำตอบของ Carl Meyer ซึ่งทำงานได้อย่างสมบูรณ์แบบจนถึงทุกวันนี้
ฉันมักจะใช้TextFieldแทนCharField(มีหรือไม่มีตัวเลือก) และกำหนดขีด จำกัด อักขระในฝั่ง UI / API มากกว่าที่ระดับ DB ในการทำงานนี้แบบไดนามิก:
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']
คิดว่าคนอื่นกำลังมองหาคำตอบอาจพบว่ามีประโยชน์