2012-11-28 31 views
2

我有一個內嵌表單集,只有三個領域: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個用於測試)。但是,當我通過內聯formset呈現此表單時,該屬性根本沒有被設置。這裏是在我看來創建的formset:

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

我在哪裏出錯了?爲什麼qty字段的大小不變?

+0

你試過寬度而不是尺寸? – karthikr

+0

@ karthikr:是的,我沒有嘗試過嘗試寬度。也嘗試過cols(textareas使用cols和rows),只是爲了它。 – Garfonzo

回答

5

編輯:它應該可能只是設置一個類到輸入字段,並讓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

這沒有奏效。 – Garfonzo

+0

你有錯誤嗎?我會處理這個問題的方式是通過jQuery,但添加小部件attrs應該從構造函數中工作。 – Furbeenator

+0

不,沒有錯誤 - 頁面剛剛加載時沒有任何暗示某事是錯誤的提示(讓我想知道如果我正在設計錯誤的表單,我沒有)。有趣的想法重新jQuery。我會檢查一下。謝謝您的幫助。 :) – Garfonzo

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的觀點修改。我沒有嘗試JQuery變體(雖然模板使用JQuery,但我現在還沒有)。

唯一的缺點是現在字段寬度是用像素或em/ex等CSS單位來定義的。我要切換到ex,但是如果CSS有一個「平均字符寬度」單位,那麼你可以定義這樣的盒子來「保存20個字符」等等。

+0

要使用樣式,我建議不要使用內嵌樣式標記,而是向輸入框中添加類屬性。這種方式都是在HTML CSS方面處理的。查看代碼應該真的與顯示分開,所以可能是最好的類屬性,恕我直言。 – Furbeenator

+0

在一般情況下,這是有道理的 - 我同意從顯示分割視圖。我有一個現有的模板可以使用 - 到目前爲止,我還沒有想過弄亂它的CSS文件。 – winwaed

+0

我聽說過。有時候,解決方法是當前問題範圍的最佳答案。 – Furbeenator

0

也可以爲每個輸入的表單添加一個css類名。要做到這一點,你應該添加小部件attr到你的表單輸入的定義。像波紋管:

field_name = forms.CharField(label='label', max_length=100, widget=forms.TextInput(attrs={'class':'input-control'}))