调整Django Admin中的字段大小

当添加或编辑pipe理员的条目时,Django倾向于填充横向空间,但在某些情况下,当编辑8个字符的date字段或CharField(也可能是6或8个字符)字符宽,然后编辑框上升到15或20个字符。

我怎么能告诉pipe理员文本框应该是多么宽,或者一个TextField编辑框的高度?

您应该使用ModelAdmin.formfield_overrides 。

这很容易 – 在admin.py ,定义:

 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) 

不要忘记,你应该导入适当的类 – 在这种情况下:

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

你可以使用它的“attrs”属性在widget上设置任意的HTML属性。

您可以使用formfield_for_dbfield在Djangopipe理员中执行此操作:

 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 

或者使用自定义的Widget子类和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}} 

一个快速和肮脏的select是简单地提供有问题的模型的自定义模板。

如果您创build一个名为admin/<app label>/<class name>/change_form.html的模板,那么pipe理员将使用该模板而不是默认模板。 也就是说,如果您在名为people的应用程序中有名为Person的模型,则可以创build一个名为admin/people/person/change_form.html的模板。

所有的pipe理模板都有一个extrahead块,你可以通过重写来把东西放在<head> ,最后一块是每个域都有一个id_<field-name>的HTML标识。

所以,你可以在你的模板中添加如下内容:

 {% extends "admin/change_form.html" %} {% block extrahead %} {{ block.super }} <style type="text/css"> #id_my_field { width: 100px; } </style> {% endblock %} 

要更改特定字段的宽度。

通过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 

如果要更改每个字段实例的属性,可以直接将“attrs”属性添加到表单条目中。

例如:

 class BlogPostForm(forms.ModelForm): title = forms.CharField(label='Title:', max_length=128) body = forms.CharField(label='Post:', max_length=2000, widget=forms.Textarea(attrs={'rows':'5', 'cols': '5'})) class Meta: model = BlogPost fields = ('title', 'body') 

“attrs”属性主要传递将调整表单域的HTML标记。 每个条目都是您想要覆盖的属性的元组以及您想要覆盖的值。 只要你用逗号分隔每个元组,就可以input任意数量的属性。

我有一个与TextField类似的问题。 我正在使用Django 1.0.2,并希望更改关联的textarea中的“行”的默认值。 formfield_overrides在这个版本中不存在。 覆盖formfield_for_dbfield的工作,但我不得不这样做我的每个ModelAdmin子类或它会导致recursion错误。 最终,我发现将下面的代码添加到models.py工作:

 from django.forms import Textarea class MyTextField(models.TextField): #A more reasonably sized textarea def formfield(self, **kwargs): kwargs.update( {"widget": Textarea(attrs={'rows':2, 'cols':80})} ) return super(MyTextField, self).formfield(**kwargs) 

然后在定义模型时使用MyTextField而不是TextField。 我从这个答案改编了一个类似的问题。

我发现的最好的方式是这样的:

 class NotificationForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(NotificationForm, self).__init__(*args, **kwargs) self.fields['content'].widget.attrs['cols'] = 80 self.fields['content'].widget.attrs['rows'] = 15 self.fields['title'].widget.attrs['size'] = 50 class Meta: model = Notification 

对于ModelForm来说,它比覆盖具有不同小部件的字段要好得多,因为它保留了namehelp_text属性以及模型字段的默认值,所以您不必将它们复制到表单中。

在Django常见问题中有很好的描述:

问:如何在模型中的字段上更改小部件的属性?

答:覆盖ModelAdmin / StackedInline / TabularInline类中的formfield_for_dbfield

 class MyOtherModelInline(admin.StackedInline): model = MyOtherModel extra = 1 def formfield_for_dbfield(self, db_field, **kwargs): # This method will turn all TextFields into giant TextFields if isinstance(db_field, models.TextField): return forms.CharField(widget=forms.Textarea(attrs={'cols': 130, 'rows':30, 'class': 'docx'})) return super(MyOtherModelInline, self).formfield_for_dbfield(db_field, **kwargs) 

您可以随时在自定义样式表中设置字段大小,并告诉Django将它用于ModelAdmin类:

 class MyModelAdmin(ModelAdmin): class Media: css = {"all": ("my_stylesheet.css",)} 

为1.6,使用表格我必须指定charfield里面的textarea属性:

 test1 = forms.CharField(max_length=400, widget=forms.Textarea( attrs={'rows':'2', 'cols': '10'}), initial='', help_text=helptexts.helptxt['test']) 

与msdin相同的答案,但与TextInput而不是TextArea:

 from django.forms import TextInput class ShortTextField(models.TextField): def formfield(self, **kwargs): kwargs.update( {"widget": TextInput(attrs={'size': 10})} ) return super(ShortTextField, self).formfield(**kwargs)