如何让Django用户注册单步(而不是两步)进程与电子邮件强制?

时间:2011-07-08 18:00:21

标签: python django django-admin django-views

我希望Django发送电子邮件到用户的电子邮件地址,一旦管理员将新用户添加到管理站点,就会发送登录详细信息。所以我尝试使用Django信号,但只是becoz 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 个答案:

答案 0 :(得分:8)

如果查看django.contrib.auth admin.py,您会看到UserAdmin类将add_form指定为UserCreationForm。

UserCreationForm仅包含用户模型中的“用户名”字段。

由于您提供自己的UserAdmin,因此您只需将add_form覆盖到自定义UserCreationForm,其中包含使信号正常工作所需的字段。

希望能帮到你。

[编辑]

这是来自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

注意fields =(“username”,)tuple,它排除User模型上的所有其他字段。你需要这样的东西:

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

然后您可以将其用作自定义UserAdmin中的add_form:

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属性。这就是电子邮件字段没有以添加形式显示的原因。

答案 1 :(得分:0)

this example尝试根据需要在自定义UserCreationForm中定义电子邮件= True:

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

    class Meta:
        model = User
        fields = ('username', 'email',)
相关问题