2017-02-26 124 views
1

在視圖中:我需要顯示從固定值(比如2005)開始到當前年份的下拉列表。現在,這個列表雖然是動態的,但不是來自數據庫。此外,我希望列表隨着時間的推移而擴大。HTML在Django中選擇帶動態列表的下拉框ModelForm

在模型:我想這個字段像一個IntegerField(?),它只保存從2005年的值到3000,然後拋出一個驗證錯誤。

我能做些什麼 - 在視圖中將下拉列爲ChoiceField,併爲模型設置驗證程序。

我想要什麼 - 我想在Django中使用ModelForm,因爲此字段以及其他表單映射到我的模型的字段。這意味着我不會在我的表單中定義字段,而只能在模型中定義字段。因此,問題是我的方法是什麼?

這我都試過這麼遠

class Member(models.Model): 
    d = int(datetime.datetime.now().strftime("%Y")) 
    ch = [(X,X) for X in range(2005,d)] 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    membership_type = models.IntegerField(validators=[validate_membership_type]) 
    batch = models.IntegerField(choices= ch) 

這將生成所需選擇字段的形式,但該值不會改變。我用'分鐘'替換'年份'以測試它,並且範圍保持固定,其上限爲啓動服務器時的分鐘數,即模型創建時的分鐘數。我希望這個範圍由視圖決定,即當表單加載到瀏覽器上時。

回答

1

首先,這段代碼不屬於模型,而是形式。其次,如果你需要動態的東西,他們必須進入__init__方法,而不是在課堂上。所以:

class MemberForm(forms.ModelForm): 
    class Meta: 
     model = Member 
     fields = [..., 'batch', ...] 

    def __init__(self, *args, **kwargs): 
     super(MemberForm, self).__init__(*args, **kwargs) 
     d = datetime.datetime.now().year 
     ch = [(X,X) for X in range(2005, d)] 
     self.fields['batch'].choices = ch 
+0

感謝Daniel的快速回復。但是,只有一件事,你的意思是「這段代碼不屬於模型,而是形式'?你是指前兩行,因此暗示這種邏輯不應該成爲模型的一部分? (因爲我需要在'代碼'的其餘部分的幫助下定義我的模型,不是嗎?) – kshubham07

+0

是的,我的意思是動態選擇的東西。顯然,字段定義是模型的一部分,但您應該完全從中刪除選項。 –

+0

嗨Daniel,聲明'self.fields ['batch']。choices = ch'不起作用,因爲表單的IntegerField沒有選擇屬性(模型類的屬性)。我把它改成'self.fields ['batch']。widget = forms.Select(choices = ch)',它工作。請在您的答案中進行此更改,並將其標記爲正確。 感謝您的幫助(y) – kshubham07