2013-04-10 44 views
0

在我的模型,我下面Django的表單集驗證:自動修復校驗錯誤

--- models.py --- 
class A(models.Model): 
    my_Bs = models.ManyToManyField('B', through='AlinksB') 
    ... 

class B(models.Model): 
    ... 

class AlinksB(models.Model): 
    my_A = models.ForeignKey(A) 
    my_B = models.models.ForeignKey(B) 
    order = models.IntegerField() 

那麼,相應的管理(A管理視圖有一個內嵌到鏈路B的情況下,我準備需要定製這個內嵌的表單集和表單):

--- admin.py --- 
class AlinksBInlineForm(forms.ModelForm): 
    class Meta: 
     model = AlinksB 

class AlinksBInlineFormset(forms.models.BaseInlineFormSet): # there also is a BaseModelFormset 
    form = AlinksBInlineForm 

class AlinksBInline(admin.TabularInline): 
    formset = AlinksBInlineFormset 
    model = AlinksB 

class AAdmin(admin.ModelAdmin): 
    form = AForm 
    inlines = (AlinksBInline,) 
    ... 

class BAdmin(admin.ModelAdmin): 
    ... 

我們自定義表單驗證,沒什麼難度:剛剛覆蓋表單對象的「乾淨」的方法。如果你想在formset中使用許多不同的表單,我想你只需在formset的「init」方法中手動更改一些表單。但是當我們清理表單集時,編程式驗證所有表單,而且只在某些條件下執行。

在我的情況下:如果所有的訂單(內聯排除行)都是空的,如何自動設置「訂單」字段(在管理視圖的內聯行)和自動增量?

回答

3

我只是花了很多時間在Django框架中使用formset驗證期間嘗試執行自動錶單清理。幾天後,無法找到解決方案,因此我開始正確查看Django的源代碼,以查看工作字段,窗口小部件,窗體和窗體集的工作方式。

這是我的理解:

- 所有用戶上傳數據時,他提交其存儲在該formset「數據」該formset的屬性。這個屬性非常難看,不能直接使用。 - 表單只是字段的封裝(它調用所有字段的乾淨方法和填充錯誤緩衝區,並且只有幾個)

- 表單字段有一個小部件。這個小工具允許從「數據」找回領域的原始值該formset的屬性

form.add_prefix('field name') # returns the 'field prefix', the key of formset.data used to retrieve the field's raw value 
form.fields['field name'].widget.value_from_datadict(form.data, form.files, 'field prefix') # returns the raw value 

-The表單域也有改造的原始值轉換成正確的蟒蛇值(在我的情況的方法:順序是一個整數,或無如果字段已經被留爲空)

form.fields['field name'].to_python(raw_value) # returns a value with the right type 

- 可以字段之一的值從該formset用下面的代碼

form.data.__setitem__('field prefix', value) # code to update an iterable knowing the key to change 
01改變

- 一旦您修改了字段值,您可以調用表單的「full_clean」方法重試清除它們(這將刪除以前的錯誤)。

- 一旦您再次驗證了表單,您也可以重新使用其「full_clean」方法驗證表單集。但是要注意避免無限循環

-The形式乾淨的數據只能用於具有隻讀數據,在形式或該formset添加更多的錯誤消息

的其它解決辦法是手動改變「form.clean_data」屬性,並清理formset.errors和所有form.errors

希望它可以幫助與我處於相同情況的人!

Ricola3D