2010-01-27 19 views
4

提示我有一個基本的模式自定義部件:Django的 - 與「你的意思是」基於驗證

class MyModel(models.Model): 
    my_field = models.CharField() 

我對這種模式的基本方式:

class MyFrom(forms.ModelForm): 
    class Meta: 
     model = MyModel 

而且我有一個功能,做一個基本的查詢(在現實中複雜得多,正則表達式等,不會做):

POSSIBLE_VALUES = ['aa', 'bb', 'cc', 'dd'] 

def lookup(some_value): 
    if some_value in POSSIBLE_VALUES: 
     # the value is OK, return a string 
     return some_value 
    else: 
     # constructs the 'did you mean' list of suggestions 
     didyoumean = [pv for pv in POSSIBLE_VALUES if pv in some_value] 
     # returns a list which might be empty 
     return didyoumean 

現在,我想要的場景是:

  1. 在我的「my_field」輸入字段中輸入值,並點擊提交按鈕的網站。
  2. 如果該值通過查找,我應該自動執行表單的操作。
  3. 如果我得到多個可能的值,那麼我應該將它們顯示給用戶,並進行任何其他操作。
  4. 如果我沒有得到答案(一個空列表),我應該得到一個錯誤消息。

一些額外的要求:

  1. 我寧願「你的意思是」列表中,而無需重新加載頁面顯示。
  2. 如果用戶點擊我想沒有一個額外的查找執行形式的行動建議之一 - 價值已經得到遏制。
  3. 我想保留視圖之外的所有邏輯並將其保存在表單中或模型中。這是必須的。
  4. 我想避免在模板中硬編碼的js和推入形式,如果可能的。這不是必須的。

因此,我假設它將全部分佈在這些字段驗證和一個自定義小部件之間,它將處理「你的意思」列表呈現。我不能把它放在一起。

你的幫助是需要:)

編輯。廣告。 2的要求。 這是我描述的基本特徵。在更高級的一箇中,我希望這個表單有更多的字段,所以「你的意思」列表應該與所有其他字段錯誤(如果有的話)一起顯示。然後點擊提示只需將my_field的值設置爲它的值,而無需重新加載表單。用戶也必須糾正其他錯誤,所以我不能馬上去表單的操作。可能只有一些標誌可以在這兩個選項(「基本」和「高級」)之間切換。

回答

2
  1. 我寧願「你的意思是」列表中,而無需重新加載頁面 顯示。

創建定製窗口小部件,其與JS代碼呈現爲作爲用戶輸入它檢查可能值

  • 如果其中一條建議用戶點擊我想要執行 表單的操作,而無需額外的 查找 - 該值已被選中 。
  • 同樣,單擊該小部件時,應該只提交表單。

  • 我想保持所有的邏輯視圖外,並保持它在 形式或在模型中。這是必須的。
  • 在窗體上,您將使用clean()方法來驗證所有內容。例如,假如某些虛假數據通過p提交。 2 - 你仍然提出驗證錯誤。

  • 我想避免在模板硬編碼js和如果 可以將其推入的形式。這不是必須的。
  • 用自定義小部件解決,details

    +0

    嘿,我最近幾天一直在研究這個問題,並且讓它工作。有些部分是醜陋的,因爲我想讓這個方法可重用,因此需要動態生成東西 - 比如將值從視圖傳遞到表單(創建時),以便它轉到部件的呈現方法。 我修改了一下我的要求,但通常這是我做的(使用jQuery): 1.單擊提交按鈕將表單(序列化)發送到ajax處理視圖。 2.如果表單驗證,我發回一個空值,如果它沒有驗證,那麼我發送回呈現的表單。 – virtuallight 2010-02-05 22:20:39

    +0

    3.當答案回到js: - 如果爲空,則表單被提交併最終正確處理 - 如果不是空的(帶有錯誤和提示的表單) 4 。點擊一個提示將它的值放入輸入字段,並通過ajax再次驗證表單get。 Thx爲答案。它讓我深信挖掘這個小部件是正確的選擇;) – virtuallight 2010-02-05 22:21:20

    相關問題