Подтвердить что ты не робот

Управление размером с виджетами TextArea в django admin

Мне удалось переопределить внешний вид виджета TextArea в интерфейсе администратора django двумя способами:

с помощью 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}),
   }

in 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>

И вот скриншот:

Form

В соответствии с W3C referecnce для текстовой области:

Размер текстовой области также может быть задан с помощью свойств высоты и ширины CSS.

Итак, мои вопросы:

  • Является ли django собственная тема css ответственной здесь за "нечетные" поведение этого виджета?
  • Может ли кто-нибудь предложить способ решить эту проблему?
4b9b3361

Ответ 1

Это проблема, зависящая от браузера.

В соответствии с потоком Высота textarea не соответствует строкам в Firefox:

Firefox всегда добавляет дополнительную строку после текстового поля. Если вы хотите чтобы иметь постоянную высоту, используйте CSS...

Вы можете установить атрибут style в textarea:

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.

Надеюсь, что это поможет.