2016-03-07 80 views
2

我想創建一個註冊表單並創建一個用戶(模型)。如何使用元類創建註冊表單(ModelForm)作爲django.contrib.auth.models.User?

我對django很新,我不知道如何去做。 我已經寫了這個,但這似乎不工作。

class SignUpForm(forms.ModelForm): 
    confirm_password = forms.CharField(max_length=50) 

    class Meta: 
     model = User 
     fields = ['password', 'email', 'first_name', 'last_name'] 

    def is_valid(self): 
     if super(SignUpForm, self).is_valid() and self.confirm_password == self.instance.password: 
      return True 
     else: 
      False 

    def save(self, commit=True): 
     if self.is_valid(): 
      self.instance.objects.create_user(username=self.instance.email, email=self.instance.email, 
              password=self.instance.password, first_name=self.instance.first_name, 
              last_name=self.instance.last_name).save() 

當我嘗試訪問confirm_password它拋出AttributeError的 AttributeError: 'SignUpForm' object has no attribute 'confirm_password'

當我試圖accesss元類的其他屬性,如password更過,emailfirst_namelast_name使用self.instance屬性它總是返回一個空字符串''。任何人都可以請告訴我一個正確和有效的方法來創建一個註冊模型表單。 謝謝。

回答

1

由於您使用的是內置User模型,因此最簡單的方法是使用內置的UserCreationForm。您可以從django.contrib.auth.forms導入。獎金,它有一個內置的「確認密碼」字段。

+0

重用用戶創建表單,而不是編寫自己的表單是個好主意。根據您的要求,您可能會發現[django-registration](https://django-registration.readthedocs.org/en/2.0.3/)應用程序很有用。 – Alasdair

1

您不應該覆蓋is_valid()方法,而是改寫clean。在clean方法中,您可以從self.cleaned_data中獲取值,例如, self.cleaned_data['password']。有關更多信息,請參閱docs on validation

0

雖然是用於Django 1.7,但仍然可以通過此chapter of tango with django。 如果您想完全理解它,請不要忘記閱讀django文檔。

乾杯! 快樂編碼!