2010-03-31 25 views
1

這是我的代碼從視圖中的片段:Django的 - 如何以最佳方式form.save後處理ValidationErrors(提交= FALSE)

if form.is_valid(): 
     instance = form.save(commit=False) 
     try: 
      instance.account = request.account 
      instance.full_clean() 
     except ValidationError, e: 
      # Do something with the errors here... I certainly don't want to do this 180 times. 

這是一個完全混亂。誰願意在每個視圖中手動處理驗證錯誤。如果您在save(commit=False)之後沒有修改實例,那麼您不必擔心這個問題,但是在我的情況下,如果每個模型都有一個外部關鍵字account,該關鍵字設置在幕後並且對用戶隱藏?

任何幫助真的很感激。

回答

2

我認爲formModelForm由於問題上的標籤。

由於ModelForm performs model validation when you call is_valid(),應該足以保證它會驗證已經包含任何後面你想使你打電話之前is_valid()場景變化的模型實例。

在調用is_valid()之前,您可以通過修改form.instance來做到這一點。

一個更通用的解決方案,使這些種形式中的變化本身是:

class PresetAttrsModelForm(ModelForm): 
    def __init__(self, *args, **kwargs): 
     preset_attrs = kwargs.pop('preset_attrs', None) 
     # Sets up self.instance, among other things 
     super(ModelForm, self).__init__(*args, **kwargs) 
     if preset_attrs: 
      for attr, value in preset_attrs.items(): 
       setattr(self.instance, attr, value) 

class MyModelForm(PresetAttrsModelForm): 
    class Meta: 
     model = MyModel 

form = MyModelForm(preset_attrs={'account': request.account}) 
+0

@insin +1謝謝!我以前認爲你只能在調用'instance = save(commit = False)'後才能訪問實例。我還有**問題,但是**:如果我手動添加屬性,這意味着我可能不會將它們包含在表單中(即使是因爲安全性而隱藏)。在這種情況下,Django不會使用'is_valid()'驗證這些字段,因爲它們被「排除」。即使它們被「排除」,我如何將它們包含在驗證過程中,以便我不必手動捕獲錯誤並使用'form._update_errors()'? – orokusaki 2010-03-31 20:39:31

+0

@insin您認爲如何? – orokusaki 2010-04-02 00:05:43