因此,我使用AbstractUser创建了一个定制模型:

class CustomUser(AbstractUser):
    email = models.EmailField(unique=True)
    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 = models.CharField(validators=[phone_regex], max_length=17, blank=False, null=False) # Validators should be a list
    is_shop = models.BooleanField(default=False)
    products = models.ManyToManyField('Product', blank=True)

    class Meta:
        db_table = "scrape_customuser"
    def save(self, *args, **kwargs):
        if not self.pk: 
            self.set_password(self.password)
        super().save(*args, **kwargs)

和一份报名表

class UserForm(UserCreationForm):
    class Meta:
        model = CustomUser
        fields = ['username', 'email', 'phone', 'password1', 'password2']

我的登录逻辑:

def shop_user_signup(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            user = form.save(commit=False)
            user.is_shop = True
            user.save()
            login(request, user)
            referring_url = request.POST.get('next', None)
                if  referring_url:
                    return redirect(referring_url)
                else:
                    return redirect('/')
    else:
        form = UserForm()
    return render(request, 'shop_user_signup.html', {'form': form})

在数据库中使用密码创建的用户得到了类似pbkdf2_sha256$600000$TvRyCcSY6eMhnV1i1urh93$aKLqPBrcma5KsuS469crJtS93UI0h+7pduJXeW6ukAU=,is_active=1的散列,不知何故,最后一次登录是2023-11-23 15:49:22.581983,即使重定向没有显示用户名,当我有

<li class="nav-item">
    {% if user.is_authenticated %}
        <a class="nav-link" href="{% url 'logout' %}">{{user.username}} | Logout</a>
    {% else %}
        <a class="nav-link" href="{% url 'login' %}">Login</a>
    {% endif %}
</li>

当我try 登录登录页面时,我收到错误Please enter a correct username and password. Note that both fields may be case-sensitive.,管理员帐户可以正常登录.

推荐答案

Don't在模型中设置密码.这将使密码散列second次:一次按表单,一次按模型.事实上,如果我们看看这BaseUserCreationForm,we see [GitHub]人:

def save(self, commit=True):
    user = super().save(commit=False)
    user.set_password(self.cleaned_data["password1"])
    if commit:
        user.save()
        if hasattr(self, "save_m2m"):
            self.save_m2m()
    return user

因此,省略第二次重复:

class CustomUser(AbstractUser):
    email = models.EmailField(unique=True)
    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 = models.CharField(
        validators=[phone_regex], max_length=17, blank=False, null=False
    )  # Validators should be a list
    is_shop = models.BooleanField(default=False)
    products = models.ManyToManyField('Product', blank=True)

    class Meta:
        db_table = 'scrape_customuser'

    # no override

您可以将该视图简化为:

def shop_user_signup(request):
    if request.method == 'POST':
        form = UserForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.is_shop = True
            user = form.save()
            login(request, user)
            referring_url = request.POST.get('next', None)
                if  referring_url:
                    return redirect(referring_url)
                else:
                    return redirect('/')
    else:
        form = UserForm()
    return render(request, 'shop_user_signup.html', {'form': form})

在模板中,选中:

{% if request.user.is_authenticated %}
    <!-- … -->
{% endif %}

Django相关问答推荐

如何创建为模型创建信号的Djangodecorator ?

如何保护单个数据库行/模型实例?

try 获取静态文件路径时 Django 给出错误

从url参数过滤的Django日期范围返回空查询集

如何连接到 docker 容器中的 postgres 数据库?

为什么在 Docker 映像中运行我的 Django 应用程序后下载属性不再起作用?

如何从 django 模板生成静态 html 文件?

AttributeError:'Manager'对象在Django中没有属性'get_by_natural_key'错误?

Django删除查询集的最后五个以外的所有内容

使用 XMLHttpRequest 提示下载文件

使用 lambda 作为属性的默认值时,Django 1.7.1 Makemigrations 失败

related_name 参数在 Django 模型中没有按预期工作?

在 Django Admin 中过滤多对多框

django admin 排序外键字段列表

django过滤器超过几天?

Table doesn't exist表不存在

在 Celery 任务中运行 Scrapy 蜘蛛

在 Django 中使用 LiveServerTestCase 时使用代码登录

如何获取经过身份验证的用户列表?

关闭 Django Rest Framework ModelViewSet 的自动分页