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'}))