在Django Admin中调整字段大小

133 投票
15 回答
83626 浏览
提问于 2025-04-15 11:50

Django在管理后台添加或编辑条目时,通常会占用很多横向空间。但是在某些情况下,这样做其实很浪费空间。比如说,当你在编辑一个日期字段时,它只需要8个字符宽,或者一个字符字段也只需要6到8个字符宽,但编辑框却可能扩展到15或20个字符宽。

我该如何告诉管理后台,文本框应该有多宽,或者文本编辑框的高度应该是多少呢?

15 个回答

45

你可以通过一个叫做“attrs”的属性,给一个小部件设置任意的HTML属性。

在Django的后台管理界面中,你可以使用formfield_for_dbfield来做到这一点:

class MyModelAdmin(admin.ModelAdmin):
  def formfield_for_dbfield(self, db_field, **kwargs):
    field = super(ContentAdmin, self).formfield_for_dbfield(db_field, **kwargs)
    if db_field.name == 'somefield':
      field.widget.attrs['class'] = 'someclass ' + field.widget.attrs.get('class', '')
    return field

或者,你也可以创建一个自定义的小部件子类,并使用一个叫做formfield_overrides的字典来实现:

class DifferentlySizedTextarea(forms.Textarea):
  def __init__(self, *args, **kwargs):
    attrs = kwargs.setdefault('attrs', {})
    attrs.setdefault('cols', 80)
    attrs.setdefault('rows', 5)
    super(DifferentlySizedTextarea, self).__init__(*args, **kwargs)

class MyModelAdmin(admin.ModelAdmin):
  formfield_overrides = { models.TextField: {'widget': DifferentlySizedTextarea}}
46

要改变某个特定字段的宽度。

这是通过 ModelAdmin.get_form 来实现的:

class YourModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        form = super(YourModelAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['myfield'].widget.attrs['style'] = 'width: 45em;'
        return form
263

你应该使用 ModelAdmin.formfield_overrides

这非常简单 - 在 admin.py 文件中,定义:

from django.forms import TextInput, Textarea
from django.db import models

class YourModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.CharField: {'widget': TextInput(attrs={'size':'20'})},
        models.TextField: {'widget': Textarea(attrs={'rows':4, 'cols':40})},
    }

admin.site.register(YourModel, YourModelAdmin)

撰写回答