Django - Изменение атрибута размера встроенного набора текста textInput

У меня есть встроенный набор форм, который имеет только три поля:

class Estimate_Product_Details(models.Model):
    proposalID = models.ForeignKey(Estimate_Construction, verbose_name='Proposal ID')
    CID = models.ForeignKey(Product, verbose_name = 'CID')
    qty = models.DecimalField(max_digits = 7, decimal_places = 2, verbose_name = 'Quantity')

    def __unicode__(self):
        return u'%s -- %s' % (self.proposalID, self.CID)

Затем я создаю форму из этой модели:

class Product_Form(ModelForm):
    class Meta:
        model = Estimate_Product_Details
        fields = ('CID', 'qty')
        widgets = {
            'qty' : forms.TextInput(attrs={'size':30})
            }

Моя цель - иметь qty поле ввода действительно маленькое (у меня там 30 для тестирования). Однако, когда я отображаю эту форму с помощью встроенного набора форм, атрибут вообще не устанавливается. Вот создание формы на мой взгляд:

    pFormSet = inlineformset_factory(Estimate_Construction, Estimate_Product_Details, form = Product_Form)

Куда я иду не так? Почему не qty изменение поля по размеру?

3 ответа

РЕДАКТИРОВАТЬ: вероятно, следует просто установить класс в поле ввода и CSS назначить ширину. Таким образом, вы можете передать его отдельным шаблонам и тому подобное для разных клиентов.

Возможно, вместо того, чтобы использовать .attrs['size'] = 30 использование .attrs['class'] = 'some_class' затем определите класс в своем HTML-шаблоне и обработайте различные размеры там.

Это должно работать:

class Product_Form(ModelForm):
    def __init__(self, *args, **kwargs):
        super(Product_Form, self).__init__(*args, **kwargs)
        self.fields['qty'].widget.attrs['size'] = 30

    class Meta:
        model = Estimate_Product_Details
        fields = ('CID', 'qty')

У меня также были проблемы с кодом @Furbeenator. Однако, проверяя полученный HTML, я нашел size атрибут был добавлен к <input> пометить правильно.

Проблема: я использовал сторонний шаблон, который переопределял <input> ширина со своим собственным определением CSS.

Решение состоит в том, чтобы передать ширину как style атрибут, а не size:

class UserProfileForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(UserProfileForm, self).__init__(*args, **kwargs)
        self.fields['company'].widget.attrs['style'] = "width:500px"

Эта модификация также работает для модификации View @Furbeenator. Я не пробовал вариант JQuery (хотя шаблон использует JQuery, я не в данный момент).

Единственным недостатком является то, что ширина поля теперь определяется в единицах CSS, таких как пиксели или em/ex. Я собираюсь перейти на ex, но было бы неплохо, если бы в CSS была единица "средней ширины символов", чтобы вы могли определять такие поля, как "вмещать 20 символов" и т. Д.

Также возможно добавить имя класса css для каждого ввода формы. Для этого вам нужно добавить виджет attr в ваше определение ввода формы. Как ниже:

field_name = forms.CharField(label='label', max_length=100, widget=forms.TextInput(attrs={'class':'input-control'}))
Другие вопросы по тегам