3

次の 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'] = 30おそらくuseを使用する代わりに.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 を使用していますが、現時点では試していません)。

唯一の欠点は、フィールド幅がピクセルや em/ex などの CSS 単位で定義されるようになったことです。exに切り替えますが、CSSに「平均文字幅」の単位があり、このようにボックスを「20文字保持」などと定義できるといいですね。

于 2013-08-22T21:39:03.420 に答える