2014-12-05 16 views
9

Dire Ho una forma CreateView base, come questo, per consentire ai nuovi utenti di registrarsi su un sito:Override un widget vista Django generico basato su classi

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'] 

Ho appena provato questo, e ha scoperto che la password il campo è reso in testo normale; come andrei a sovrascrivere la vista in modo che usi forms.PasswordInput() invece? (Mi rendo conto che è probabilmente più semplice definire il modulo manualmente, ma sono solo curioso di sapere come lo faresti.)

+0

dovresti chiamarlo in modelForm –

risposta

24

È possibile ignorare get_form() e modificare il modulo per modificare il widget nel campo della password :

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 

Ma un modo ancora migliore sarebbe semplicemente creare una classe di modulo personalizzato. Nella classe personalizzata è sufficiente impostare widgets nella classe Meta. In questo modo:

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 

In genere si inserisce anche la classe del modulo personalizzato in un file forms.py.

+0

Mi piace il modo in cui stai facendo in views.py, +1, hai mai provato questo? –

+1

Sì, ho. Preferirei comunque creare una classe separata per il modulo. Sembra più pulito – jproffitt

+0

Grazie! Il secondo approccio funziona per me, ma quando eseguo il primo ottengo l'attributo 'AttributeError: 'super' l'oggetto non ha attributo 'get_form''. –

Problemi correlati