2012-06-17 28 views
0

首先:我無法找出這個問題的正確標題。如何從給定的選擇初始化django-form數據類型字段?

總之,問題是:

我必須填寫在模板的形式和這種形式的字段是用戶依賴。例如,你經過integer(整數是不是一個數據類型)作爲參數的方法,它應該這樣返回:

fileds = forms.IntegerField() 

如果傳遞bool那麼它應該是這樣的:

fields = forms.BooleanField() 

所以我可以使用它們來創建我的表單。我試着用這段代碼,但它返回到字符串的形式。

Some.py文件:

choices = (('bool','BooleanField()'), 
      ('integer','IntegerField()')) 
def choose_field(): 
    option = 'bool' # Here it is hardcoded but in my app it comes from database. 
    for x in choices: 
     if x[0]==option: 
     type = x[1] 
    a = 'forms' 
    field = [a,type] 
    field = ".".join(field) 
    return field 

當我打印領域它打印'forms.BooleanField()'。我也使用這個返回值,但它沒有工作。艾米解決這個問題?

+0

爲什麼不'型=字典(選擇)[選項]'? (你可能會在後面的某個地方運行不必要的'eval',而不是'getattr'。) – dhill

回答

2

最簡單的方法是創建您的表單類幷包含所有可能選擇的字段。然後在這個類中寫一個構造函數,並且你不想出現這個構造函數hide the fields。構造函數必須帶一個參數指示我們需要哪些字段。將此參數存儲在表單中並在clean方法中使用它可以相應地根據此參數對收集的數據進行校正,這會很有用。

class Your_form(forms.ModelForm): 
    field_integer = forms.IntegerField() 
    field_boolean = forms.BooleanField() 

    def __init__(self, *args, **kwargs): 
    option = kwargs["option"] 
    if option == "integer": 
     field_boolean.widget = field_boolean.hidden_widget() 
    else: 
     field_integer.widget = field_integer.hidden_widget() 
    super(Your_form, self).__init__(*args, **kwargs) 

在你的控制器:

option = 'bool' 
form = Your_form(option=option) 
+0

但是我沒有像這個問題那樣的額外領域(你給了我一個鏈接)。我想創建一個新字段,並且該字段的數據類型是選項變量的值。在我的應用程序中,當用戶註冊他時。他輸入一個保存在其用戶配置文件模型中的選項值。所以***選項***就是這個價值。 –

+0

你在說要包括所有的領域。我剛剛舉了一個例子,實際上所有領域都有選擇。所以我不能選擇那個選項。 :( –

+0

爲每種類型創建單獨的字段。一個整數字段,一個布爾字段等。 –