Как сделать так, чтобы регистрация пользователя в Django была одноэтапной (вместо двухэтапной) с обязательной электронной почтой? - PullRequest
2 голосов
/ 08 июля 2011

Я хочу, чтобы Django отправил электронное письмо на адрес электронной почты пользователя с данными для входа, как только администратор добавит нового пользователя на сайт администратора. Поэтому я попытался использовать для этого сигналы Django, но только потому, что регистрация пользователя Django - это двухступенчатый процесс, когда сигналы получают уведомление.только на первом этапе и вызывается функция электронной почты без адреса электронной почты (который идет на втором этапе).Мой код сигнала:

def email_new_user(sender, **kwargs):
    if kwargs["created"]:  # only for new users
        new_user = kwargs["instance"]
       send_mail('Subject here', 'Here is the message.', 'from@example.com',['to@example.com'], fail_silently=False)


post_save.connect(email_new_user, sender=User)

Итак, что я пытался преодолеть эту проблему. Я использую этот код в admin.py

class UserAdmin(admin.ModelAdmin):
    list_display = ('username', 'email', 'first_name', 'last_name', 'date_joined', 'last_login')
    search_fields = ['username', 'email']
    filter_horizontal = ('user_permissions',)

admin.site.unregister(User)
admin.site.register(User, UserAdmin)

Это делает весь процесс регистрации одностадийным процессом, и мойсигналы начинают работать и отправка почты на user_id при добавлении нового пользователя. Но проблема возникла после этого были:

1.Пароль пользователя не конвертируется в хеш и отображается при входе в форму, что делает его не способным войти на сайт администратора.

2. Поле электронной почты в форме не является обязательным, что я хочубыть обязательным.

Пожалуйста, помогите мне: (

[РЕДАКТИРОВАТЬ]

I tried your code But I m still at same place where i was before posting this question.
the code i used in my admin.py is:
from django.contrib import admin
from mysite.naturefarms.models import *
from django.contrib.auth.models import User,Group
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django import forms
from django.contrib.admin.views.main import *

class MyUserCreationForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('username', 'email',)
class UserAdmin(admin.ModelAdmin):
    add_form = MyUserCreationForm

admin.site.unregister(User)

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




admin.site.register(User, MyUserAdmin)

This is the output I m getting using this code which is even not converting password field into hash.

Ответы [ 2 ]

8 голосов
/ 09 июля 2011

Если вы загляните в django.contrib.auth admin.py, вы увидите, что класс UserAdmin определяет add_form как UserCreationForm.

UserCreationForm включает в себя только поле «username» из модели User.

Поскольку вы предоставляете свой собственный UserAdmin, вы можете просто переопределить add_form для пользовательской UserCreationForm, которая включает в себя поля, необходимые для правильной работы вашего сигнала.

Надеюсь, это поможет вам.

[редактировать]

Вот форма UserCreationForm от contrib.auth forms.py:

.
class UserCreationForm(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."))

    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_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

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

Обратите внимание на кортеж fields = ("username",), который исключает все остальные поля в модели User. Вам нужно что-то вроде:

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

тогда вы можете использовать это как add_form в вашем пользовательском UserAdmin:

class UserAdmin(admin.ModelAdmin):
    add_form = MyUserCreationForm

Уже довольно поздно в моей части мира, но я посмотрю, смогу ли я получить рабочий образец для вас завтра.

[Изменить]

Хорошо, вот необходимые изменения, которые вам нужно сделать, чтобы эта работа работала. Я тестировал его с помощью 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)

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

admin.site.register(User, MyUserAdmin)

Я не видел, чтобы у UserAdmin изначально было свойство add_fieldset. Вот почему поле электронной почты не отображалось в форме добавления.

0 голосов
/ 24 июля 2014

С в этом примере попробуйте определить адрес электронной почты в пользовательской форме UserCreationForm при необходимости = True:

class MyUserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)

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