2012-07-09 40 views
1

我正在編輯django.contrib.auth.forms.UserChangeForm。基本上,auth_user的用戶編輯頁面。Django auth用戶的用戶更改表單上的super()保存方法

https://github.com/django/django/blob/master/django/contrib/auth/forms.py

根據源代碼,形式不具有save()方法,所以應該從forms.ModelForm繼承權?

對於完整的代碼,see here

class MyUserAdminForm(forms.ModelForm): 
    class Meta: 
     model = User 

    def __init__(self, *args, **kwargs): 
     super(MyUserAdminForm, self).__init__(*args, **kwargs) 
     instance = getattr(self, 'instance', None) 
     if instance and instance.id: # username and user id 
      ... the rest of the __init__ is setting readonly fields 

    .... some clean methods ..... 

    def save(self, *args, **kwargs): 
     kwargs['commit'] = True 
     user = super(MyUserAdminForm, self).save(*args, **kwargs) 
     print user.username 
     print 'done' 
     return user 

當我點擊保存,故稱'UserForm' object has no attribute 'save_m2m'。我GOOGLE了很多,並嘗試使用add(),但沒有奏效。什麼導致了這種行爲?

事情是:打印兩個print語句。但該值從未保存到數據庫中。我認爲第二線已經保存了一次。

感謝

+0

爲什麼你要替換此表單的保存方法? [信號](https://docs.djangoproject.com/zh/dev/topics/signals/)是否適合您? – danihp 2012-07-09 09:52:26

+0

是的。我知道這個解決方案。實際上,信號對於這個特定用例來說是更好的選擇。我只是嘗試了超()。謝謝:))) – User007 2012-07-09 13:28:10

回答

4

取出kwargs['commit'] = True線,看看有什麼情況發生。

Django管理將調用form.save_m2m(),這是掛在formcommitFalseherekwargs['commit'] = True的無條件覆蓋將打破setattrsave_m2m()form因此no attribute錯誤被提出。實際的影響邏輯是here

def save_form(self, request, form, change): 
    """ 
    Given a ModelForm return an unsaved instance. ``change`` is True if 
    the object is being changed, and False if it's being added. 
    """ 
    return form.save(commit=False) 

你可以發現你的form.save()版本覆蓋commit=Falsecommit=True無條件,從而Django管理無法繼續,因爲它認爲form.save(commit=False)被調用,從而form.save_m2m()需要調用。

參考文獻the doc

當你的模型具有 與其他模型許多一對多關係使用提交=假的另一個副作用是看到。如果您的模型具有 多對多關係,並且在保存 表單時指定了commit = False,則Django無法立即保存多對多關係的表單數據。這是因爲無法將實例的多對多數據保存到 數據庫中,直到該實例存在爲止。

要解決此問題,每次使用 commit = False保存表單時,Django都會在您的ModelForm 子類中添加一個save_m2m()方法。在手動保存由 表單生成的實例後,可以調用save_m2m()來保存多對多表單數據。

+0

謝謝,沒關係。我在iPad上,所以稍後我會回頭看看它是如何發生的。誤讀UserCreateForm的保存部分。是否所有m2m保存都必須設置爲false?另外,在那裏提交的默認值是true。那有什麼用途呢?謝謝。 – User007 2012-07-09 13:30:59

+0

很好的答案,謝謝! – 2013-01-24 01:27:11

相關問題