我有一个只有三个字段的内联formset:
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个用于测试)。但是,当我通过内联formset渲染此表单时,该属性根本没有设置。这是我视图中formset的创建:
pFormSet = inlineformset_factory(Estimate_Construction, Estimate_Product_Details, form = Product_Form)
我哪里错了?为什么qty
字段的大小没有变化?
答案 0 :(得分:6)
编辑:它应该只是将一个类设置为输入字段并让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')
答案 1 :(得分:0)
我也遇到了@ Furbeenator代码的问题。但是,在检查生成的HTML时,我发现size
属性已正确附加到<input>
标记。
问题:我使用的是第三方模板,它使用自己的CSS定义覆盖了<input>
宽度。
解决方案是将宽度作为style
属性而不是size
传递:
class UserProfileForm(ModelForm):
def __init__(self, *args, **kwargs):
super(UserProfileForm, self).__init__(*args, **kwargs)
self.fields['company'].widget.attrs['style'] = "width:500px"
此修改也适用于@ Furbeenator的View修改。我没有尝试过JQuery变体(虽然模板使用的是JQuery,但我现在还没有)。
唯一的缺点是现在根据CSS单位(例如像素或em / ex)定义字段宽度。我将切换到ex,但如果CSS具有“平均字符宽度”单位,那么你可以将这样的框定义为“保持20个字符”等等。
答案 2 :(得分:0)
也可以为表单的每个输入添加一个css类名。要做到这一点,您应该将widget attr添加到表单输入的定义中。像吼叫:
field_name = forms.CharField(label='label', max_length=100, widget=forms.TextInput(attrs={'class':'input-control'}))