简体   繁体   English

我怎样才能让 Django 用户注册单步(而不是两步)过程与 email 强制性?

[英]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 registration is a two step process signals get notified in first step only and called email function without email address(which comes in second step). 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 registration is a two step process signals get notified in first step仅称为 email function 没有 email 地址(在第二步中)。 My signal code:我的信号代码:

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)

So what i tried to overcome this problem.I use this code in admin.py所以我试图克服这个问题。我在 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)

This makes all registration process a single step process and my signals start working and sending mail to user_id on new user addition.But the problem came after this were:这使得所有注册过程都成为一个步骤,我的信号开始工作并在添加新用户时向 user_id 发送邮件。但问题是在此之后出现:

1. User password is not converted into hash and is visible while entering into form,that makes user not able to login into admin site. 1.用户密码没有转换成hash,在输入表单时可见,导致用户无法登录管理站点。

2.Email field in form is not compulsory which I want to be compulsory. 2.Email 形式的字段不是强制性的,我想是强制性的。

Please help me:(请帮我:(

[EDIT] [编辑]

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)

这是我使用此代码得到的输出,它甚至没有将密码字段转换为哈希。

If you look in django.contrib.auth admin.py, you'll see that the UserAdmin class specifies the add_form as UserCreationForm.如果您查看 django.contrib.auth admin.py,您会看到 UserAdmin class 将 add_form 指定为 UserCreationForm。

UserCreationForm only includes the 'username' field from the User model. UserCreationForm 仅包含来自用户 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.由于您提供自己的 UserAdmin,因此您可以将 add_form 覆盖为自定义 UserCreationForm ,其中包含使信号正常工作所需的字段。

Hope that helps you out.希望对您有所帮助。

[Edit] [编辑]

Here's the UserCreationForm from contrib.auth forms.py:这是来自 contrib.auth forms.py 的 UserCreationForm:

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

Notice the fields = ("username",) tuple which excludes all other fields on the User model.注意 fields = ("username",) 元组,它排除了用户 model 上的所有其他字段。 You need something like:你需要类似的东西:

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

then you can use that as the add_form in your custom UserAdmin:然后您可以将其用作自定义 UserAdmin 中的 add_form:

class UserAdmin(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:我已经使用 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)

I didn't see that the UserAdmin had an add_fieldset property initially.我没有看到 UserAdmin 最初有一个 add_fieldset 属性。 That's why the email field wasn't displaying in the add form.这就是 email 字段未显示在添加表单中的原因。

From this example try defining email in your custom UserCreationForm as required=True:此示例中,尝试在自定义 UserCreationForm 中定义 email 为 required=True:

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM