在django admin中控制TextArea小部件的大小

时间:2013-09-11 10:17:20

标签: python css django django-admin

我设法用两种不同的方式覆盖django管理界面中TextArea Widget的外观:

使用formfield_overrides

admin.py中的

class RulesAdmin(admin.ModelAdmin):
formfield_overrides = {
    models.TextField: {'widget': Textarea(
                       attrs={'rows': 1,
                              'cols': 40})},
}

...
admin.site.register(Rules, RulesAdmin)

这种方式有点过分,因为它会改变所有的TextField 模型。

使用自定义表单:

forms.py中的

from django.forms import ModelForm, Textarea
from TimePortal.models import Rules


class RulesModelForm(ModelForm):
    class Meta:
        model = Rules
        widgets = {
            'parameters': Textarea(attrs={'cols': 30, 'rows': 1}),
   }
admin.py

中的

from AppName.forms import RulesModelForm

class RulesAdmin(admin.ModelAdmin):

    form = RulesModelForm

两种解决方案都会调整TextArea的大小。但是在两种解决方案中的实际大小 文本区域超过1行(实际上是2行)。以下是呈现的HTML的外观:

    <div class="form-row field-parameters">
            <div>
                <label for="id_parameters" class="required">Parameters:</label>
                <textarea id="id_parameters" rows="1" cols="30" name="parameters">{}</textarea> 
           <p class="help">Enter a valid Python Dictionary</p>
         </div>
    </div>

这是一个screentshot:

Form

根据W3C referecnce for text area

  

textarea的大小也可以通过CSS高度和宽度属性指定。

所以,我的问题是:

  • django自己的css主题是这里负责的“奇怪” 这个小部件的行为?
  • 有人可以提出解决此问题的方法吗?

1 个答案:

答案 0 :(得分:32)

这是特定于浏览器的问题。

根据帖子Height of textarea does not match the rows in Firefox

  

Firefox总是在文本字段后添加一行。如果你想要的话   要有一个恒定的高度,请使用CSS ...

您可以设置textarea的style属性:

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

class RulesAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.TextField: {'widget': Textarea(
                           attrs={'rows': 1,
                                  'cols': 40,
                                  'style': 'height: 1em;'})},
    }

适合我 - 在Firefox v.23和Chrome v.29上测试。

希望有所帮助。