# in forms.py from django import forms from django.utils.translation import ugettext_lazy as _ from django.utils.http import int_to_base36 from django.contrib.auth.models import User from django.contrib.auth.tokens import default_token_generator from django.contrib.sites.models import Site 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 # in views.py from django.core.urlresolvers import reverse from django.shortcuts import render_to_response from django.template import RequestContext from django.http import HttpResponseRedirect from django.contrib.auth.tokens import default_token_generator from django.contrib.sites.models import Site def register(request, template_name='registration/registration_form.html', email_template_name='registration/password_reset_email.html', token_generator=default_token_generator): if request.method == 'POST': form = RegistrationForm(data=request.POST) if form.is_valid(): opts = {} opts['use_https'] = request.is_secure() opts['token_generator'] = token_generator opts['email_template_name'] = email_template_name if not Site._meta.installed: opts['domain_override'] = RequestSite(request).domain form.save(**opts) return HttpResponseRedirect(reverse('registration_complete')) else: form = RegistrationForm() return render_to_response(template_name, {'form': form}, RequestContext(request))