簡體   English   中英

姜戈。 如何在 User 模型中添加額外的字段並將其顯示在管理界面中

[英]Django. How to add an extra field in User model and have it displayed in the admin interface

我正在學習 Django,需要一些幫助。

我需要在我的用戶模型中包含一個額外的布爾字段(我相信數據庫中的 auth_user 表),並在管理用戶時將其顯示在管理界面中,例如此圖像中的員工狀態字段...

127:0.0.1:8000/管理員/用戶

在此處輸入圖片說明

和...

127.0.0.1:8000/admin/auth/user/2/change/ :

在此處輸入圖片說明

我不確定如何處理這個問題。 我知道我必須擴展 AbstractUser 模型,然后可能手動將該字段添加到數據庫中,但是如何更新管理界面的視圖、表單和模板的新字段? 我是否必須為所有這些重寫 django 管理源代碼,還是有更簡單的方法?

最好的方法是使用 User OneToOneField 創建新模型。 例如

class UserProfile(models.Model):
   user = models.OneToOneField(User)
   phone = models.CharField(max_length=256, blank=True, null=True)
   gender = models.CharField(
        max_length=1, choices=(('m', _('Male')), ('f', _('Female'))),
        blank=True, null=True)

您可以在 User Model 或 UserProfile Model 中使用 django admin,並可以相應地顯示 Admin 中的字段

我是這樣做的:

注意:這應該在您創建新項目時完成。

向用戶模型添加字段:-

模型.py:

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
   gender = models.BooleanField(default=True) # True for male and False for female
   # you can add more fields here.

覆蓋默認的用戶模型:-

設置.py:

# the example_app is an app in which models.py is defined
AUTH_USER_MODEL = 'example_app.User' 

在管理頁面上顯示模型:-

管理.py:

from django.contrib import admin
from .models import User

admin.site.register(User)

你有兩個選擇,它們是:

  1. 通過添加另一個模型並使用一對一關系將其鏈接到 User 模型來擴展現有的 User 模型。 見這里

  2. 編寫自己的用戶模型並使用它,這對於新手來說會很困難。 見這里

#managers.py  Create new file.
from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _
class CustomUserManager(BaseUserManager):
    def create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError(_('The Email must be set'))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user
    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', 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(email, password, **extra_fields)

#models.py  Create your models here.
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.utils.translation import gettext_lazy as _
from .managers import CustomUserManager
class User(AbstractBaseUser,PermissionsMixin):
    first_name =models.CharField(max_length=250)
    email = models.EmailField(_('email address'), unique=True)
    mobile =models.CharField(max_length=10)
    status = models.BooleanField(default=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []
    object =CustomUserManager()
    # add more your fields
    
#admin.py
from django.contrib import admin
from .models import User
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = ('email','mobile','password')
#setting.py
AUTH_USER_MODEL = 'users.User'

# run command
python manage.py makemigrations
python manage.py migrate

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM