python – 如何让Django用户注册单步(而不是两步)进程与电子邮件强制?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 如何让Django用户注册单步(而不是两步)进程与电子邮件强制?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4424字,纯文字阅读大概需要7分钟。
内容图文
![python – 如何让Django用户注册单步(而不是两步)进程与电子邮件强制?](/upload/InfoBanner/zyjiaocheng/951/f6efbf9595244a5abd7aef37132fd693.jpg)
我希望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.Email字段不是强制性的,我想成为强制性的.
请帮我 :(
[编辑]
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)
解决方法:
如果你查看django.contrib.auth admin.py,你会看到UserAdmin类将add_form指定为UserCreationForm.
UserCreationForm仅包含User模型中的“username”字段.
由于您提供自己的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属性.这就是电子邮件字段没有以添加形式显示的原因.
内容总结
以上是互联网集市为您收集整理的python – 如何让Django用户注册单步(而不是两步)进程与电子邮件强制?全部内容,希望文章能够帮你解决python – 如何让Django用户注册单步(而不是两步)进程与电子邮件强制?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。