首页 > 解决方案 > 如何在 Django 中保存自定义用户类属性?

问题描述

我在使用 Django 方面相当新,所以如果有任何不清楚的地方,请原谅。

基本上,我创建了一个自定义用户模型:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


class AccountManager(BaseUserManager):
    def create_user(self, username, password=None):
        if not username:
            raise ValueError('A username is required for you to sign up')

        user = self.model(
            username=username,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, password):
        user = self.create_user(
            password=password,
            username=username,
        )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user


class Account(AbstractBaseUser):

    username = models.CharField(max_length=40, unique=True)
    password = models.CharField(max_length=999)

    points = 0

    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now=True)

    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'username'  # Cannot be included in required fields
    REQUIRED_FIELDS = ['password']

    objects = AccountManager()

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return self.is_admin

    @staticmethod
    def has_module_perms(app_label):
        return True

在 下class Account(AbstractBaseUser),我定义了一个属性points。我想让它每当用户重定向时,用户都会得到一些分数。

from django.shortcuts import render, redirect


def home_page_view(request):
    return render(request, "home_page.html", {})


def free_points(request):
    request.user.points += 10
    request.user.save()
    return render(request, "add_points_test.html", {})

为了检查是否添加了点,我稍微更改了视图下的代码:

from django.shortcuts import render, redirect


def home_page_view(request):
    print(request.user.points)
    return render(request, "home_page.html", {})


def add_points_view(request):
    request.user.points += 10
    request.user.save()
    print(request.user.points)
    return render(request, "add_points_test.html", {})

从我所见,当用户被重定向到时,打印出来add_points_viewprint语句。但是,当用户被重定向回 时,将打印出下面的语句而不是. 这表明我根本没有改变。add_points_view10home_page_viewprinthome_page_view010points

我不确定我应该做什么。对不起,如果这个问题是一个不好的问题,我真的在互联网上找不到任何东西。

提前致谢。

标签: pythondjango

解决方案


核心问题是你没有定义points为持久化字段,所以即使你调用了save方法中add_points_view的信息也会丢失。

检查https://docs.djangoproject.com/en/3.0/topics/db/models/


推荐阅读