用戶關係模型的建立

用戶關係模型的建立

上次我們搭建了環境,這次,我們創建用戶表和超級管理員。

創建app(user)

  1. 我們cd到apps這個文件目錄下,在ubantu的終端中打入命令django-admin startapp <appname>,一定要注意,打這個命令的時候有兩個條件,**一個是在apps這個文件目錄下,另一個就是用的專用的虛擬環境,**不然都創建不了app。
  2. 然後在生成的user中創建一個python文件,命名是urls。
  3. 在settings裏面的INSTALLED_APPS裏面註冊app,就是把它的名字加上,然後,去主項目的urls裏面,導入include這個方法,再將原來我們創建好的文件url拼接上去。

注意,user app裏面的urls必須是這樣的格式:

from django.urls import path
from user import views
app_name = 'user'
urlpatterns = [
   
]

不然就會報錯。

from django.urls import path,include

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('',include('user.urls')),
    # path('user/', include('user_m.urls')),
    # path('', include('verifications.urls')),
]

models文件

我們在models文件裏面創建我們要的用戶模型。

用戶模型我設計成兩個,一個是普通用戶,一個是超級用戶。

django自帶用戶模型,但是根據我們中國人的習慣,通常用手機號註冊爲主,郵箱是可有可無的,所以,我要改一下django的代碼結構,變成我們想要的。

所用到的類介紹

先導入兩個類

from django.contrib.auth.models import AbstractUser,UserManager as _UserManager
from django.db import models

UserManager

    def create_superuser(self, username, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError('Superuser must have is_staff=True.')
        if extra_fields.get('is_superuser') is not True:
            raise ValueError('Superuser must have is_superuser=True.')

        return self._create_user(username, email, password, **extra_fields)

在源碼中,有一個create_superuser屬性,這個是創建超級管理員,我們要將裏面傳參的email改成email=None使它默認爲空,這樣就可以了。同時,我們要初始化父類的方法,在models裏面修改的代碼如下:

class UserManager(_UserManager):
    """
    define user manager for modifing 'no need email'
    when 'python manager.py createsuperuser '

    """

    def create_superuser(self, username, password, email=None, **extra_fields):#用原來的類去傳遞自身定義的參數
            super().create_superuser(username=username,password=password, email=email, **extra_fields)#繼承了super的方法,創建

AbstractUser

源碼:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _('username'),
        max_length=150,
        unique=True,
        help_text=_('Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.'),
        validators=[username_validator],
        error_messages={
            'unique': _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_('first name'), max_length=30, blank=True)
    last_name = models.CharField(_('last name'), max_length=150, blank=True)
    email = models.EmailField(_('email address'), blank=True)
    is_staff = models.BooleanField(
        _('staff status'),
        default=False,
        help_text=_('Designates whether the user can log into this admin site.'),
    )
    is_active = models.BooleanField(
        _('active'),
        default=True,
        help_text=_(
            'Designates whether this user should be treated as active. '
            'Unselect this instead of deleting accounts.'
        ),
    )
    date_joined = models.DateTimeField(_('date joined'), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email'] #這個要設置成你想要默認必須輸入的參數。

我們分析一下源碼,這個源碼裏面包含了username並且它是唯一的,還有first_name,last_name,但是他們默認空白是可以的,就是那個blank=True參數。我們看最下面,有一個REQUIRED_FIELDS,這個就是我們要改的內容,我們先在代碼中添加mobile字段,再把它在我們的代碼中改成mobile,其它不動。

代碼如下:

class User(AbstractUser):

    objects = UserManager()#創建一個代理管理器

    REQUIRED_FIELDS = ['mobile']#這個是必須要加上去的,不然會默認指定
    mobile = models.CharField(max_length=11,unique=True,verbose_name='手機號',help_text='手機號',error_messages={'unique':'此手機號已經註冊'})
    email_ac = models.BooleanField(default=False,verbose_name='郵箱狀態')
    class Meta:
        db_table = 'tb_users'
        verbose_name = '用戶'


    def __str__(self):
        return self.username

參數介紹

help_text

這個是幫助性文字,用來提示用戶。

error_messages

是指定的報錯信息,爲之後註冊的時候打下鋪墊。給js用的。

Meta

這是一個抽象類,用來補充該類的參數,在生成模型的時候不會被實例化成對象。、

db_table

這個是給數據庫中的模型取個別名,方便查看和管理,不然django會根據駝峯命名規則給你自動生成一個。

verbose_name

給Model去一個方便閱讀的名字,這個是方便後臺管理取得名字。

最後

當所有都做好之後,我們不能直接遷移,還需要最最最關鍵的一步,這一步沒弄好,前面的都是瞎搞,這一步就是在settings文件裏面,指定替換的用戶模型類,在settings裏面最好在最後,添加:

AUTH_USER_MODEL = 'user.User'  # 指定替換的用戶模型類,這個User就是我們的類名!!!

然後在項目目錄下在cmd中執行操作:

# 先
python manage.py makemigrations
# 後
python manage.py migrate

第二種,直接在pycharm中Tools這一欄,點擊 Run manage.py Task,然後直接先輸入makemigrations,然後再輸入migrate。最後查看數據庫,會發現,多了很多的表,這些表是正常的,是django自帶的用戶系統,我們只需要查看我們的tb_users在不在裏面就行。

最後的最後,在剛剛開啓的命令端輸入,createsuperuser,創建我們第一個管理員吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章