2014-12-05 33 views
9

說我有一個基本的CreateView的形式,這樣,允許新用戶在網站上註冊:覆蓋Django的通用的基於類的視圖部件

from django.contrib.auth import get_user_model 
from django.http import HttpResponse 
from django.views.generic import CreateView 

User = get_user_model() 


class Signup(CreateView): 

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

我只是嘗試這樣做,發現密碼字段以純文本呈現;我將如何去覆蓋視圖,以便它使用forms.PasswordInput()來代替? (我意識到這可能是最簡單的,只需手工定義表單,但我只是好奇你是如何做到的。)

+0

你應該在modelForm中調用它 – 2014-12-05 18:01:28

回答

24

你可以覆蓋get_form(),並修改表單以更改密碼字段上的小部件:

from django import forms 

class Signup(CreateView): 
    model = User 
    fields = ['first_name', 'last_name', 'email', 'password'] 

    def get_form(self, form_class): 
     form = super(Signup, self).get_form(form_class) 
     form.fields['password'].widget = forms.PasswordInput() 
     return form 

但更好的方法是創建一個自定義窗體類。在自定義類中,只需在Meta類上設置widgets。像這樣:

from django import forms 

class SignupForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ['first_name', 'last_name', 'email', 'password'] 
     widgets = { 
      'password': forms.PasswordInput() 
     } 

class Signup(CreateView): 
    form_class = SignupForm 
    model = User 

通常你會把自定義窗體類放在forms.py文件中。

+0

我喜歡你在views.py,+1中的行爲方式,你有沒有嘗試過? – 2014-12-05 18:08:37

+1

是的,我有。我寧願爲這個表單創建一個單獨的類。看起來更清潔。 – jproffitt 2014-12-05 18:10:00

+0

謝謝!第二種方法適用於我,但是當我做第一個時,我得到'AttributeError:'super'對象沒有屬性'get_form'。 – 2014-12-05 19:23:49