Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django使用生成的密码保存用户_Python_Django - Fatal编程技术网

Python 使用Django使用生成的密码保存用户

Python 使用Django使用生成的密码保存用户,python,django,Python,Django,我试图用生成的密码和用户名保存一个用户,但遇到了一点小麻烦 My view.py如下所示: ... if request.method == "POST": u = get_username(request.POST.get('first_name', '').lower() + "." + request.POST.get('last_name', '').lower()) p = User.objects.make_random_password(length = 6)

我试图用生成的密码和用户名保存一个用户,但遇到了一点小麻烦

My view.py如下所示:

...
if request.method == "POST":

    u = get_username(request.POST.get('first_name', '').lower() + "." + request.POST.get('last_name', '').lower())
    p = User.objects.make_random_password(length = 6)

    form = PrincipalRegistrationForm(request.POST, request.FILES)

    if form.is_valid():

        ...

        new_user = form.save(uname = u, pword = p)

        return HttpResponseRedirect("/path/to/site")
...
class PrincipalRegistrationForm(UserCreationForm ):

    first_name = forms.CharField(label = 'First name')
    last_name = forms.CharField(label = 'Last name')

    school = forms.ModelChoiceField(queryset = School.objects.all())
    profile_pic = forms.FileField(required=False)



    def save(self,commit = True, uname = "unkown", pword = "unknown"):   

        user = super(PrincipalRegistrationForm, self).save(commit = False)

        user.username = uname
        user.set_password = make_password(pword)

        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']


        if commit:
            user.save()
        return user

    def __init__(self, *args, **kwargs): 
            super(PrincipalRegistrationForm, self).__init__(*args, **kwargs) 
            self.fields.pop('username')
            self.fields.pop('password1')
            self.fields.pop('password2')
我的forms.py如下所示:

...
if request.method == "POST":

    u = get_username(request.POST.get('first_name', '').lower() + "." + request.POST.get('last_name', '').lower())
    p = User.objects.make_random_password(length = 6)

    form = PrincipalRegistrationForm(request.POST, request.FILES)

    if form.is_valid():

        ...

        new_user = form.save(uname = u, pword = p)

        return HttpResponseRedirect("/path/to/site")
...
class PrincipalRegistrationForm(UserCreationForm ):

    first_name = forms.CharField(label = 'First name')
    last_name = forms.CharField(label = 'Last name')

    school = forms.ModelChoiceField(queryset = School.objects.all())
    profile_pic = forms.FileField(required=False)



    def save(self,commit = True, uname = "unkown", pword = "unknown"):   

        user = super(PrincipalRegistrationForm, self).save(commit = False)

        user.username = uname
        user.set_password = make_password(pword)

        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']


        if commit:
            user.save()
        return user

    def __init__(self, *args, **kwargs): 
            super(PrincipalRegistrationForm, self).__init__(*args, **kwargs) 
            self.fields.pop('username')
            self.fields.pop('password1')
            self.fields.pop('password2')
用户名由一个helper函数生成,由fname和lname组成,并发送到save函数,如代码中所示,工作正常(如果我手动键入密码)。现在我希望密码像用户名一样生成和保存,但我有问题。我发现以下错误:

Exception Type: KeyError
Exception Value: u'password1'
Exception Location: /usr/local/lib/python2.7/dist-packages/django/contrib/auth/forms.py in save, line 121
谢谢你的帮助,我也很感激你对我应该如何编写代码或者是否应该修改一些东西的建议

回溯:

Environment:


Request Method: POST
Request URL: http://localhost:8000/siteadmin/add/principal

Django Version: 1.7.5
Python Version: 2.7.6
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'app_accounts',
 'app_schools',
 'app_school_subjects')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware')


Traceback:

    File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
      111.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
    File "/path/to/ednevnik/app_accounts/views.py" in add_principal
      80.             new_user = form.save(uname = u, pword = p)
    File "/path/to/ednevnik/app_accounts/forms.py" in save
      64.         user = super(PrincipalRegistrationForm, self).save(commit = False)
    File "/usr/local/lib/python2.7/dist-packages/django/contrib/auth/forms.py" in save
      121.         user.set_password(self.cleaned_data["password1"])

    Exception Type: KeyError at /siteadmin/add/principal
    Exception Value: u'password1'
已解决:

def save(self, commit = True, uname = "unkown", pword = "unknown"):   
    # Adding this line solved my problem
    self.cleaned_data['password1'] = pword

    user = super(PrincipalRegistrationForm, self).save(commit = False)

    user.username = uname
    user.first_name = self.cleaned_data['first_name']
    user.last_name = self.cleaned_data['last_name']

    if commit:
        user.save()
    return user

使用
类Meta:exclude=['somefield']
和我的方法来解决这个问题,方法是在执行正常保存之前更改表单的实例。

我看到两件事:
user.set\u password
是一个函数,需要像这样调用:
user.set\u password(password)
。那么,这不是一个错误,但是您不需要重写
save
函数的所有代码。您应该从父类继承,并在它之前执行代码。只需验证您在
self.cleaned\u data
中有什么,您没有这个
password1
,就这样!在save函数中的“user=super(PrincipalRegistrationForm,self).save(commit=False)”行之前添加了“self.cleaned_data[“password1”]=pword”之后,一切正常:D Thnaks!您应该认真思考您编写的代码,并尝试改进它。正如我在帖子中所说,你可以去掉很多无用的代码。很高兴我能帮上忙是的,我知道这一点,但我目前的目标是一切按我的意愿进行。谢谢你的建议,我一定会考虑的!没有名为“password1”的字段,只有“password”,所以如果您只排除“password”,您就可以了