[英]How to use Django's PasswordChangeView with a custom user?
[英]how to use django's registration field(s) to custom table
发布时,我需要使用注册表格的现有字段(即密码)(不是新字段)在单独的表上使用
我的代码如下
from django.contrib.auth.models import User
from django.db.models.signals import post_save
class Token(models.Model):
user = models.OneToOneField(User)
api_key=models.CharField(max_length=50)
def create_user_token(sender, instance, created, **kwargs):
if created:
profile, created = Token.objects.get_or_create(user=instance)
#this will definitely not work because i have no field name api_key on form
post_save.connect(create_user_token, sender=User)
我创建apikey的逻辑如下
#password=posted from django-registration form as i have used django-registration
digest = hmac.new('Secret', password, hashlib.sha256).hexdigest()
我正在使用django注册,并且每当用户注册或更改密码时都需要设置api_key = digest
Django注册有一个特殊的user_registered信号,例如,您可以从request.POST
中获取所需的信息。
要更改密码,您还可以编写自己的视图(基于django的视图)并从那里发送信号(甚至是相同的信号)。
同意Ilvar和Frantzdy的意见,您需要使用user_registered信号。 请按照以下步骤
Forms.py
from django import forms
from registration.forms import RegistrationForm
from django.utils.translation import ugettext_lazy as _
from registration.models import RegistrationProfile
attrs_dict = { 'class': 'required' }
class RegistrationFormEx(RegistrationForm):
cell_phone = forms.CharField(widget=forms.TextInput(attrs=attrs_dict))
models.py
import hashlib
import hmac
from django.db import models
from django.contrib.auth.models import User
from registration.signals import user_registered
from userInfo.forms import RegistrationFormEx
class ExProfile(models.Model):
user = models.ForeignKey(User, unique=True)
cell_phone = models.CharField(max_length=200, blank=True)
api_key= models.CharField(max_length=200, blank=True)
def user_created(sender, user, request, **kwargs):
form = RegistrationFormEx(data=request.POST)
digest = hmac.new(str(request.POST['password1']), str(request.POST['username']), hashlib.sha256).hexdigest()
new_user = User.objects.get(username=request.POST['username'])
//here I have added api_key hash algo, you can change it
new_profile = ExProfile(user=new_user,cell_phone=request.POST['cell_phone'],api_key=digest)
new_profile.save()
return new_user
user_registered.connect(user_created)
urls.py
from django.conf.urls import patterns, include, url
import registration.backends.default.urls as regUrls
from registration.views import register
from userInfo.forms import RegistrationFormEx
urlpatterns = patterns('',
url(r'^accounts/register/$', register, {'backend': 'registration.backends.default.DefaultBackend','form_class': RegistrationFormEx}, name='registration_register'),
(r'^accounts/', include('registration.backends.default.urls'))
)
希望您现在就可以更改密码,祝您好运
如果您创建一个change_password视图,建议添加几行代码来更改该键。 出于演示目的:
profile = Token.objects.get(user=request.user)
#set a new api key
profile.api_key =hashlib.sha1(str(random.random()) +
'app_name' +
str(time.time())).hexdigest()
profile.save()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.