2013-04-25 70 views
1

我有兩個使用Django管理員模型表單的基本模型。 Models.py是類似於:爲什麼我的表單清理方法沒有做任何事情?

class FirstModel(models.Model): 
    name = CharField(max_length=100) 
    url = URLField() 
class OtherModel(models.Model): 
    model = models.ForeignKey(FirstModel) 
    ##Other fields that show up fine and save fine, but include some localflavor 

Forms.py類似於:

class FirstModelForm(forms.ModelForm): 
    def clean(self): 
     #call the super as per django docs 
     cleaned_data = super(FirstModelForm, self).clean() 
     print cleaned_data 
    class Meta: 
     model = FirstModel 
#other modelform is the same with the appropriate word substitutions and one field that gets overridden to a USZipCodeField 

這些堆疊內嵌的ModelAdmin有沒有什麼特別的admin.py:

class OtherModelInline(admin.StackedInline): 

    model = OtherModel 
    fields = (#my list of fields works correctly) 
    readonly_fields = (#couple read onlys that work correctly) 

class FirstModelAdmin(admin.ModelAdmin): 
    inlines = [ 
     OtherModelInline, 
     ] 
admin.site.register(FirstModel, FirstModelAdmin) 

我確實有一個用戶模型,表單和ModelAdmin,它們將User和UserCreationForm劃分爲子類,並覆蓋它自己的clean方法。這與預期完全相同。 問題出在FirstModelOtherModel。我在FirstModelFormOtherModelForm的ModelForm子類中重寫的乾淨方法不會執行任何操作。沒有異常拋出或者打印出的清潔數據。根本不值一提。其他一切按預期工作,但它就像我的乾淨的方法甚至沒有。 我得到了一些簡單的東西,但我看不到是什麼。任何幫助都會很棒。謝謝!

回答

1

默認情況下,Django爲您的模型管理員動態生成模型表單。您必須通過設置表單屬性來指定要使用自定義表單。

class OtherModelInline(admin.StackedInline): 

    model = OtherModel 
    fields = (...) # if this doesn't work after specifying the form, set fields for the model form instead 
    readonly_fields = (#couple read onlys that work correctly) 
    form = OtherModelForm 

class FirstModelAdmin(admin.ModelAdmin): 
    form = FirstModelForm 
    inlines = [ 
     OtherModelInline, 
     ] 
admin.site.register(FirstModel, FirstModelAdmin) 
+0

謝謝!這正是我應該知道的,因爲我在User ModelAdmin中分配了這個表單。我知道這很簡單,我有時會遭受嚴重的功能性固定。再次感謝。 – 2013-04-25 23:51:44

0

您需要從表格中的clean方法中返回cleaned_data。如果你看一下the documentation for cleaning fields that rely on each other,你會發現:

... 
# Always return the full collection of cleaned data. 
return cleaned_data 
+0

我明白了。謝謝,但這不會導致我乾淨的方法不做任何事情。應該仍然有一個打印輸出到我的'清潔數據'的控制檯。 – 2013-04-25 22:03:53

0

這可能是沒有什麼生還父「乾淨」的方法。如果您提交的數據由於模型設置的方式而無法驗證,則清空數據將爲空。這是由鄧肯,連接的同一個文檔,它說提到:

通過被稱爲形式的清潔()方法,所有的單個領域的清潔方法將已經運行(前兩節)的時候,所以self.cleaned_data將填充迄今爲止存活的任何數據。 所以你還需要記住考慮到你想要驗證的字段可能沒有在最初的單個字段檢查中存活。

在這種情況下,如果你有一個URLField,字段有效性是非常嚴格的,除非你確定「verify_exists =假」,它也將檢查您是否在返回一個404一個URL推杆。在你的情況,你需要做這個,如果你想允許:

class FirstModel(models.Model): 
    name = CharField(max_length=100) 
    url = URLField(verify_exists=False) 

以外的是,我不知道有什麼可以怎麼回事。

+0

感謝您的回答,但不是我正在尋找的。雖然我不知道'verify_exists'參數,我現在是。 – 2013-04-25 23:53:56

+0

沒問題,很高興有人讓你排序。我沒有使用內置的管理員已經好幾年了:) – cardonator 2013-04-26 15:39:14

相關問題