2014-09-23 31 views
0

這是一個懸而未決的問題。 我想寫HTML頁面來定義/編輯問題(數據庫對象)。 A 問題由一個小文本和一個類型組成:該類型表示其赤緯。 問題偏角,例如,滑塊的是否自由文本選擇題。 對於自由文本是否否刪節,不需要進一步的信息。 但是對於滑塊多選,必須輸入附加信息。Django表單和子表單的方法

我做過/試過那麼什麼是創造形式,查看和模板定義一個通用的問題,創造子爲需要其它附加字段每個問題赤緯表單,視圖和模板

問題是我遇到了困難,以便在子窗體中保留通用問題ID以將附加字段附加到問題上。我試圖將它傳遞給子視圖,但我必須在窗體中訪問它以保存帶有問題引用的數據庫對象,所以它意味着在窗體中添加隱藏的輸入字段,這會導致其他問題,等等etc ...

我缺乏的是web開發體驗...我可以得到的更好的東西是動態下拉菜單,它適應於所選的問題類型,但我不知道JavaScript或ajax語言現在,所以一些不同的觀點/模板就足夠了。

什麼是最簡單/最好的方法來實現這一目標? 我不是要求代碼,而是像一種方法。

請讓我知道,如果我錯過了一些讓問題無法理解的問題。

回答

2

您的方法對我來說似乎很好(創建基本視圖,窗體類和模板,可以爲每個偏角繼承和定製),除了模型部分。

由於您的偏差可能有一些自定義字段,因此我認爲使用相同的模型來處理所有問題類型並不是很有效。

我會用model inheritance,如下:

class BaseQuestion(models.Model): 
    """Your base model for all questions""" 
    title = models.CharField(max_length=255) 
    description = models.TextField() 

class YesNoQuestion(BaseQuestion): 
    pass 

class FreeTextQuestion(BaseQuestion): 
    pass 

class MultipleChoicesQuestion(BaseQuestion): 
    # assuming you have a QuestionChoice model to store your available choices 
    choices = models.ManyToManyField(QuestionChoice) 

class SliderQuestion(BaseQuestion): 
    slider_start = models.IntegerField(default=1) 
    slider_end = models.IntegerField(default=10) 

請參閱Django文檔有關模型繼承了深入的解釋,但有一件事你必須知道:它會影響性能,尤其在大型數據庫上。然而,在你的情況下,似乎要走。

另請注意,某些django應用程序(如django-polymorphic)可能會幫助您使用模型繼承。

對於過程的其餘部分,好,我將遵循這一過程:

  • 該處理鹼形式爲中心(標題和描述字段)的圖,以及一個其它附加字段與列表所有可用的問題偏差
  • 當用戶選擇一個類型時,您觸發一個將發佈表單數據的ajax請求。該視圖不保存任何內容,而是返回另一個表單,對應於所選的偏角,並填入先​​前輸入的值。這樣,您就不必關心保留ID,因爲返回了一個全新的表單。
  • on post,這個表單應該引發另一個專用的偏角視圖,它將處理數據並將相應問題模型的一個實例保存到數據庫中