在Django注册和登录中,"NoneType"对象没有属性"set_password" [英] 'NoneType' object has no attribute 'set_password' in django registration and login

查看:74
本文介绍了在Django注册和登录中,"NoneType"对象没有属性"set_password"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对django完全陌生.尝试创建登录和注册系统.

I am entirely new to django. Trying to create login and registration system.

用户注册成功,保存在数据库中,但是注册后出现此错误.

User registers successfully, saved in database but I get this error after registering.

'NoneType'对象没有属性'set_password'"

views.py

def register(request):
if request.method == 'POST':
    form = SignUpForm(request.POST)
    if form.is_valid():
        user = form.save(commit=False)
        form.save()
        username = form.cleaned_data.get('username')
        fullname = form.cleaned_data.get('fullname')
        password = form.cleaned_data.get('password1')
        user = authenticate(request, username=username, password=password)
        messages.success(request, f'Welcome to blaza {fullname}')
        user.set_password(password)
        user.save()
        if user is not None:
            login(request, user)
        return redirect(reverse('home'))
else:
    form = SignUpForm()
return render(request, 'accounts/signup.html', {'form': form})

当我删除"user.set_password"时,它可以工作,但是即使用户名和密码正确,注册用户也无法使用其凭据登录,它表示用户名和密码不正确.(只有管理员帐户,超级用户可以登录).

When I remove "user.set_password" it works but registered users can not login with their credentials even when the username and password is correct, It says incorrect username and password. (only admin account, superuser can login).

因此,我进行了研究,不得不添加user.set_password和user = form.save(我收到警告,未使用局部变量user值)

So I researched and had to add the user.set_password and user = form.save (I get warning that local variable user value is not used)

forms.py

class SignUpForm(UserCreationForm):
username = forms.CharField(max_length=50)
fullname = forms.CharField(max_length=200)
email = forms.EmailField(max_length=200)
password2 = None

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

def clean_password1(self):
    password1 = self.cleaned_data.get('password1')
    try:
        password_validation.validate_password(password1, self.instance)
    except forms.ValidationError as error:
        self.add_error('password1', error)
        return password1

Models.py

class CustomUser(AbstractUser):
class Meta:
    db_table = 'users'
fullname = models.CharField(max_length=200)
email = models.EmailField(max_length=150)
profile_photo = models.ImageField(upload_to='images/profile_pics', default='images/nophoto.png')
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$',
                             message="Phone number must be entered in the format: '+999999999'. Up to 15 "
                                     "digits "
                                     "allowed.")
phone_number = models.CharField(validators=[phone_regex], max_length=13, default='')
address = models.CharField(max_length=100, default='')
has_store = models.BooleanField(default=False)

signup.html

<form method="post">
{% csrf_token %}
{% for field in form %}
<p>
  {{ field.label_tag }}<br>
  {{ field }}
  {% if field.help_text %}
    <small style="color: grey">{{ field.help_text }}</small>
  {% endif %}
  {% for error in field.errors %}
    <p style="color: red">{{ error }}</p>
  {% endfor %}
</p>
{% endfor %}
<button type="submit">Sign up</button>
</form>

urls.py

urlpatterns = [
path('admin/', admin.site.urls),
path('', TemplateView.as_view(template_name='home.html'), name='home'),
path('accounts/', include('users.urls')),
path('accounts/', include('django.contrib.auth.urls')),
]

或者有人可以帮助我进行切实有效的安全注册和登录.

Or Someone help me with a secured and working registration and login that actually works.

推荐答案

以简单的注册形式:

def register(request):
 if request.method == 'POST':
     form = SignUpForm(request.POST)
     if form.is_valid():
        username = form.cleaned_data.get('username')
        fullname = form.cleaned_data.get('fullname')
        password = form.cleaned_data.get('password1')
        saved_user = form.save(commit=False)
        saved_user.set_password(password)
        saved_user.save()
        user = authenticate(request, username=username, password=password)
        messages.success(request, f'Welcome to blaza {fullname}')
        if user is not None:
            login(request, user)
        return redirect(reverse('home'))
 else:
     form = SignUpForm()
 return render(request, 'accounts/signup.html', {'form': form})

获得noneType的原因是因为您在authenticate()之后保存了用户,所以它返回None

The reason you get noneType because you save user after the authenticate() so it return None

这篇关于在Django注册和登录中,"NoneType"对象没有属性"set_password"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆