Pereiti prie turinio

Django registracija


Rekomenduojami pranešimai

Sveiki, gal kas turite patarimų, kaip padaryti registraciją su e.pašto patvirtinimu?

 

Kol kas mano kodas atrodo taip:

 

forms.py

class RegistrationForm(forms.ModelForm):
       username = forms.CharField(label=(u'Username'))
       email = forms.EmailField(label=(u'Email'))
       password1 = forms.CharField(label=(u'Password'),widget=forms.PasswordInput(render_value=False))
       password2 = forms.CharField(label=(u'Verify Password'), widget=forms.PasswordInput(render_value=False))


       class Meta:
               model = User
               fields = ('username',)

       def clean_username(self):
               username = self.cleaned_data['username']
               try:
                   User.objects.get(username=username)
               except User.DoesNotExist:
                   return username
               raise forms.ValidationError(u'User already exists')

       def clean_email(self):
               if User.objects.filter(email__iexact=self.cleaned_data['email']):
                   raise forms.ValidationError(u'Email already exists')
               return self.cleaned_data['email']

       def clean(self):
               password1 = self.cleaned_data.get('password1')
               password2 = self.cleaned_data.get('password2')
               if password1 != password2:
                   raise forms.ValidationError(u'Passwords do not match')
               return self.cleaned_data

views.py

def RegistrationFormRequest(request):
       if request.user.is_authenticated():
           return HttpResponseRedirect('/profile/')
       if request.method == 'POST':
           form = RegistrationForm(request.POST)
           if form.is_valid():
               user = User.objects.create_user(username = form.cleaned_data['username'],email = form.cleaned_data['email'],password = form.cleaned_data['password2'])
               user.save()
               return HttpResponseRedirect('/profile/')
           else:
               return render_to_response('register.html',{'form':form}, context_instance=RequestContext(request))
       else:
           form = RegistrationForm(request.POST)
           return render_to_response('register.html',{'form':form},context_instance=RequestContext(request))

Redagavo beniens
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Kodo nerašysiu, bet esmė: padarai tokeną registracijos metu, išsiunti į email, user'į padarai neaktyvų (is_active = False). Paspaudus nuorodą su token'u - suaktyvini.

 

Bet galiu pasakyt pastebėjimų dėl kitų tavo kodo dalių:

 

1. Naudoji ModelForm, tačiau tau tai nė kiek nepadeda, nes viską vis tiek perrašai pats - laukelius, validaciją, netgi kuri vartotoją perduodamas rankomis argumentus po vieną iš formos. Jei jau taip, tai nelabai matau prasmės naudoti ModelForm.

2. (u'Verify Password') čia galbūt turėjai omeny _(u'Verify Password'), kas būtų funkcijos, pavadinimu _ iškvietimas (ji skirta vertimams, jei nežadi turėti kelių kalbų - gali ir nenaudoti).

3. Visiškai vienodą

return render_to_response('register.html',{'form':form}, context_instance=RequestContext(request))

panaudoji dukart. Manau būtų galima iškelti į pačią funkcijos pabaigą ir nesirūpinti.

4.

def RegistrationFormRequest(request):

Tikrai negeras vardas viewui, o ir apskritai bet kokiai Python funkcijai. Pasidomėk PEP-8 - pagrindiniu stiliaus gidu python kodui. Šiuo atveju aš daryčiau tiesiog:

def register(request):

5. Grįžtant prie registracijos - pasidomėk esamais apps'ais, skirtais tam dalykui. Galbūt tiks kuris nors iš jų, pvz. django-registration. Nereikia išradinėti dviračio, jei tinka esamas. Na, nebent tam, kad žinias gilintum, bet realiam darbe - nebūtinai :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pabandysiu tai įgyvendinti :)

 

Dėkui, už pastebėjimus. Šiaip naudojau forms.Form, bet kai dariau įvairius bandymus, neveikė save() funkcija, todėl buvau pakeitęs į ModelForm ir nebepakeičiau atgal.

Kaip suprantu smarkiai per daug apsikraunu kodo rašymo darbu. Gal pasidalinsi mintimis, kaip racionaliau jį rašyti?

(u'Verify Password') "u" pridėjau dėl kuodotės, nors jos čia aišku nereikia, o Verify.. tai tiesiog label`is :)

Return`us sumečiau, kad kiekvienas if turėtų savo return`ą, tiesiog dėl tvarkos.

Dėl pavadinimo sutinku, teks pasiskaityti.

 

Jo, mačiau, kad yra App`sų, bet kaip jau pats užsiminei - darau, kad pagilinčiau žinias.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pabandysiu tai įgyvendinti :)

 

Dėkui, už pastebėjimus. Šiaip naudojau forms.Form, bet kai dariau įvairius bandymus, neveikė save() funkcija, todėl buvau pakeitęs į ModelForm ir nebepakeičiau atgal.

Kaip suprantu smarkiai per daug apsikraunu kodo rašymo darbu. Gal pasidalinsi mintimis, kaip racionaliau jį rašyti?

(u'Verify Password') "u" pridėjau dėl kuodotės, nors jos čia aišku nereikia, o Verify.. tai tiesiog label`is :)

Return`us sumečiau, kad kiekvienas if turėtų savo return`ą, tiesiog dėl tvarkos.

Dėl pavadinimo sutinku, teks pasiskaityti.

 

Jo, mačiau, kad yra App`sų, bet kaip jau pats užsiminei - darau, kad pagilinčiau žinias.

Nes Form ir neturi save - į DB saugosi ne forma, o modelis.

 

Dėl u raidės man viskas aišku - tie skliaustai be reikalo, turbūt kaip ir sakiau būsi pražioplinęs tą _ :) Kad „kiekvienas if turėtų savo return“ - nelabai matau kame čia daugiau tvarkos. Kodas nėra medis kuris išsišakoja ir nebegrįžta - po if'o funkcija vykdysis toliau, jei jame negrąžinama ar kitaip nenutraukiama.

Naudok šiek tiek „vertikalios indentacijos“, t.y. atskirk kažkokias atskiras kodo dalis tuščiomis eilutėmis. Pvz, perdarau tavo funkciją:

def register(request):
       if request.user.is_authenticated():
           return HttpResponseRedirect('/profile/')

       if request.method == 'POST':
           form = RegistrationForm(request.POST)
           if form.is_valid():
               user = User.objects.create_user(username = form.cleaned_data['username'],email = form.cleaned_data['email'],password = form.cleaned_data['password2'])
               user.save()
               return HttpResponseRedirect('/profile/')

       else:
           form = RegistrationForm(request.POST)

       return render_to_response('register.html',{'form':form},context_instance=RequestContext(request))

 

Šiek tiek lengviau skaitosi, nei viskas suplakta į vieną vietą, tiesa?

Dar vieną dalyką pastebėjau beredaguodamas - naudoji 8 tarpų indentaciją. PEP-8 pataria ir kokie 98% bendruomenės naudoja 4 tarpus (ne TAB simbolius, o būtent tarpus - normalūs editoriai gražiai konvertuoja tab paspaudimus į tarpus). Python'as jautrus tokiems dalykams :)

Redagavo Silke
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Nes Form ir neturi save - į DB saugosi ne forma, o modelis.

 

Dėl u raidės man viskas aišku - tie skliaustai be reikalo, turbūt kaip ir sakiau būsi pražioplinęs tą _ :) Kad „kiekvienas if turėtų savo return“ - nelabai matau kame čia daugiau tvarkos. Kodas nėra medis kuris išsišakoja ir nebegrįžta - po if'o funkcija vykdysis toliau, jei jame negrąžinama ar kitaip nenutraukiama.

Naudok šiek tiek „vertikalios indentacijos“, t.y. atskirk kažkokias atskiras kodo dalis tuščiomis eilutėmis. Pvz, perdarau tavo funkciją:

def register(request):
       if request.user.is_authenticated():
           return HttpResponseRedirect('/profile/')

       if request.method == 'POST':
           form = RegistrationForm(request.POST)
           if form.is_valid():
               user = User.objects.create_user(username = form.cleaned_data['username'],email = form.cleaned_data['email'],password = form.cleaned_data['password2'])
               user.save()
               return HttpResponseRedirect('/profile/')

       else:
           form = RegistrationForm(request.POST)

       return render_to_response('register.html',{'form':form},context_instance=RequestContext(request))

 

Šiek tiek lengviau skaitosi, nei viskas suplakta į vieną vietą, tiesa?

Dar vieną dalyką pastebėjau beredaguodamas - naudoji 8 tarpų indentaciją. PEP-8 pataria ir kokie 98% bendruomenės naudoja 4 tarpus (ne TAB simbolius, o būtent tarpus - normalūs editoriai gražiai konvertuoja tab paspaudimus į tarpus). Python'as jautrus tokiems dalykams :)

 

Aha, jau supratau, kad neišsaugo :)

Tas jautrumas man labiausiai ir nepatinka :D Tačiau turi didžiulį pliusą, nes nori ar ne kodą rašai tvarkingai :)

 

Radau pavyzdį ir nelabai suprantu vienos vietos.

KODAS:

class RegistrationForm(forms.ModelForm):
   username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^\w+$',
       help_text = _("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."),
       error_message = _("This value must contain only letters, numbers and underscores."))
   email = forms.EmailField(label=_("E-mail"), max_length=75)

   class Meta:
       model = User
       fields = ("username",)

   def clean_username(self):
       username = self.cleaned_data["username"]
       try:
           User.objects.get(username=username)
       except User.DoesNotExist:
           return username
       raise forms.ValidationError(_("A user with that username already exists."))

   def clean_email(self):
       """
       Validate that the supplied email address is unique for the
       site.
       """

       if User.objects.filter(email__iexact=self.cleaned_data['email']).count():
           raise forms.ValidationError(_(u'This email address is already in use. Please supply a different email address.'))
       return self.cleaned_data['email']

   def save(self, commit=True, domain_override=None, email_template_name='registration/password_reset_email.html',
            use_https=False, token_generator=default_token_generator):
       user = super(RegistrationForm, self).save(commit=False)
       user.set_unusable_password()
       if not commit:
           return user
       user.save()

       from django.core.mail import send_mail
       if not domain_override:
           current_site = Site.objects.get_current()
           site_name = current_site.name
           domain = current_site.domain
       else:
           site_name = domain = domain_override
       t = loader.get_template(email_template_name)
       c = {
           'email': user.email,
           'domain': domain,
           'site_name': site_name,
           'uid': int_to_base36(user.id),
           'user': user,
           'token': token_generator.make_token(user),
           'protocol': use_https and 'https' or 'http',
       }
       send_mail(_("Password reset on %s") % site_name,
           t.render(Context(c)), None, [user.email], fail_silently=False)
       return user

user = super(RegistrationForm, self).save(commit=False)

user.set_unusable_password()

 

Šita kodo vieta išsaugo naują User`į nepatikrinus validavimo? ar iškart patikrinamas ir išsauogojimas? Beje, nelabai pagaunu commit reikšmės

Nuoroda į pranešimą
Dalintis kituose puslapiuose

user = super(RegistrationForm, self).save(commit=False)

user.set_unusable_password()

 

Šita kodo vieta išsaugo naują User`į nepatikrinus validavimo? ar iškart patikrinamas ir išsauogojimas? Beje, nelabai pagaunu commit reikšmės

commit=False yra tam, kad .save() iš tikrųjų nieko nesaugotų į duomenų bazę (taupomos užklausos), tad čia dar apskritai yra niekas nesaugoma :)

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...