2012-09-05 68 views
0

我試圖創造一個Django的驗證形式呈現的選擇列表,其中只有一個是有效的用戶。Django的「動態」覈銷單(更新)

例如,她最喜歡的比薩配料包括菠蘿和roquefort-

什麼是你最喜歡的比薩餅用戶?

  • 火腿
  • 菠蘿
  • Anchovie

的選擇應該是隨機的,每次,在順序和值,但始終有一個有效的答案。例如,如果用戶刷新頁面,形式可能是─

什麼是你最喜歡的比薩餅?

  • 馬蘇裏拉奶酪
  • 火腿
  • 羊乳

如何建立這樣的形式?我淹沒了。我們必須在什麼地方記錄某個特定表單的有效選擇:

  • 在數據庫中爲每個問題創建條目(不可縮放)?
  • 將它設置在會話(哈克)?
  • 基於用戶ID(可能是可預測的)?

編輯 - 我們做比薩配料的列表存儲在數據庫 -

class UserProfile(Model): 
    favourite_pizza_toppings = ManyToManyField(PizzaTopping) 

我要的是原樣

class QuestionForm(Form): 
    questions = ChoiceField(choices=(('a', RANDOMLY_CHOSEN_OPTION_A), 
            ('b', RANDOMLY_CHOSEN_OPTION_B), 
            ('c', RANDOMLY_CHOSEN_OPTION_C))) 

如果這樣的形式,每次的時間實例化時,所有RANDOMLY_CHOSEN_OPTIONPizzaTopping.objects.all隨機選擇,只有一個是PizzaToppingUserProfile.favourite_pizza_toppings

我們需要驗證表單當用戶發它雖然和那是有點棘手。我們必須以某種方式記錄這是每個實例化的形式有效的選擇(ab,或c)。我們應該怎麼做?

感謝

+0

你有任何的代碼呢? –

+0

看來您需要知道用戶的「有效」選擇。所以需要將選擇/問題映射到用戶。 – dm03514

+0

@ dm03514 - 我已經在數據庫中有「有效」的選擇。我會更新問題 – user1569050

回答

5

您需要在表格INIT方法建立的選擇,否則表單元素的選擇將是每次頁面加載(他們不會改變)相同。

class QuestionForm(Form): 
    questions = ChoiceField() 

    def __init__(self, *args, **kwargs): 
     super(QuestionForm, self).__init__(*args, **kwargs) 
     self.fields['questions'].choices = set_up_choices() # function that creates list 

    clean_questions(self): 
     # do your validation of the question selection 
     # here you could check whether the option selected matches 
     # a correct value, if not throw a form validation exception 
     return self.cleaned['questions'] 
+0

非常方便。簡單地結束了用隨機值填充選項(但有一個有效),然後在clean函數中,檢查用戶字段的設置值。 Simples – user1569050