3

我有一个只有三个字段的内联表单集:

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字段大小没有变化?

4

3 回答 3

7

编辑:它可能应该只为输入字段设置一个类并让 CSS 分配宽度。这样你就可以将它传递给不同的客户等单独的模板。

也许不是使用.attrs['size'] = 30use.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')
于 2012-11-28T19:16:52.650 回答
3

@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"

此修改也适用于@Furbeenator 的视图修改。我没有尝试过 JQuery 变体(虽然模板使用了 JQuery,但我暂时没有)。

唯一的缺点是字段宽度现在是根据 CSS 单位定义的,例如像素或 em/ex。我将切换到 ex,但如果 CSS 有一个“平均字符宽度”单位会很好,这样您就可以定义这样的框来“容纳 20 个字符”等。

于 2013-08-22T21:39:03.420 回答
0

也可以为表单的每个输入添加一个 css 类名。为此,您应该将小部件 attr 添加到表单输入的定义中。像下面这样:

field_name = forms.CharField(label='label', max_length=100, widget=forms.TextInput(attrs={'class':'input-control'}))
于 2018-01-12T12:21:30.600 回答