Skip to content Skip to sidebar Skip to footer

How Can I Have Django User Registration Single Step (instead Of Two Step)process With Email Compulsory?

I want Django to send an email to user email-address with Login details once admin adds a new user to admin site.So I tried using Django signals for that but just becoz django user

Solution 1:

If you look in django.contrib.auth admin.py, you'll see that the UserAdmin class specifies the add_form as UserCreationForm.

UserCreationForm only includes the 'username' field from the User model.

Since you're providing your own UserAdmin, you can just override the add_form to a custom UserCreationForm that includes the fields you need to make your signal work properly.

Hope that helps you out.

[Edit]

Here's the UserCreationForm from contrib.auth forms.py:

classUserCreationForm(forms.ModelForm):
    """
    A form that creates a user, with no privileges, from the given username and password.
    """
    username = forms.RegexField(label=_("Username"), max_length=30, regex=r'^[\w.@+-]+$',
        help_text = _("Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only."),
        error_messages = {'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")})
    password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
    password2 = forms.CharField(label=_("Password confirmation"), widget=forms.PasswordInput,
        help_text = _("Enter the same password as above, for verification."))

    classMeta:
        model = User
        fields = ("username",)

    defclean_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."))

    defclean_password2(self):
        password1 = self.cleaned_data.get("password1", "")
        password2 = self.cleaned_data["password2"]
        if password1 != password2:
            raise forms.ValidationError(_("The two password fields didn't match."))
        return password2

    defsave(self, commit=True):
        user = super(UserCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

Notice the fields = ("username",) tuple which excludes all other fields on the User model. You need something like:

classMyUserCreationForm(UserCreationForm):
    classMeta:
        model = Userfields= ('username', 'email',)

then you can use that as the add_form in your custom UserAdmin:

classUserAdmin(admin.ModelAdmin):
    add_form = MyUserCreationForm

It's pretty late in my part of the world, but I'll see if I can get a working sample for you tomorrow.

[Edit]

Ok, here's the necessary changes you'll need to make to make this work. I've tested it using Django 1.3:

from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User
from django import forms

admin.site.unregister(User)

classMyUserAdmin(UserAdmin):
    add_form = MyUserCreationForm
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'email', 'password1', 'password2')}
        ),
    )

admin.site.register(User, MyUserAdmin)

I didn't see that the UserAdmin had an add_fieldset property initially. That's why the email field wasn't displaying in the add form.

Solution 2:

From this example try defining email in your custom UserCreationForm as required=True:

classMyUserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    classMeta:
        model = Userfields= ('username', 'email',)

Post a Comment for "How Can I Have Django User Registration Single Step (instead Of Two Step)process With Email Compulsory?"