門戶網(wǎng)站是什么意思啊線上推廣方式
Django自帶的后臺管理系統(tǒng)主要用來對數(shù)據(jù)庫進行操作和管理。它是Django框架的一個強大功能,可以讓你快速創(chuàng)建一個管理界面,用于管理你的應(yīng)用程序的數(shù)據(jù)模型。
使用Django后臺管理系統(tǒng),你可以輕松地進行以下操作:
-
數(shù)據(jù)庫管理:你可以查看、添加、編輯和刪除數(shù)據(jù)庫中的記錄,而無需編寫自定義的管理界面或數(shù)據(jù)庫查詢語句。
-
模型管理:Django后臺管理系統(tǒng)會自動檢測你在應(yīng)用程序中定義的模型,并為每個模型創(chuàng)建相應(yīng)的管理界面。這樣,你就可以直接在后臺管理界面對模型進行操作。
-
用戶權(quán)限管理:Django后臺管理系統(tǒng)支持用戶認證和權(quán)限控制,你可以通過定義用戶組和權(quán)限,限制特定用戶對數(shù)據(jù)的訪問和操作。
-
自定義管理頁面:盡管Django后臺管理系統(tǒng)提供了很多默認功能,但你也可以根據(jù)需要自定義管理頁面,添加自定義的功能和視圖。
總體而言,Django后臺管理系統(tǒng)是一個強大的工具,使得對數(shù)據(jù)庫進行操作和管理變得簡單而高效,這使得開發(fā)者可以更專注于業(yè)務(wù)邏輯和功能開發(fā),而無需為了管理界面而花費大量時間和精力。
在本文中,我們在Django中創(chuàng)建與商品分類、商品信息有關(guān)的數(shù)據(jù)表模型,并利用Django自帶的后臺管理系統(tǒng)對商品分類、商品信息的數(shù)據(jù)表進行管理。
01-新建一個名為“good_info”的Project
命令如下:
CD E:\Python_project\P_001\myshop-test
E:
django-admin startproject good_info
02-新建兩個應(yīng)用
執(zhí)行下面條命令依次創(chuàng)建兩個應(yīng)用:
CD E:\Python_project\P_001\myshop-test\good_info\
E:
python manage.py startapp goods
python manage.py startapp users
上面的兩個應(yīng)用,主要的就是goods,我們會在goods的models.py中寫入商品分類和商品信息的數(shù)據(jù)庫類模型。
但由于商品信息中有用戶的信息,所以還需要有users模型。
03-在settings.py中對兩個應(yīng)用進行注冊
在settings.py中進行注冊的代碼如下:
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','users','goods',
]
04-編寫兩個應(yīng)用的數(shù)據(jù)庫模型類
04-01-users的模型創(chuàng)建及代碼詳解
打開文件:E:\Python_project\P_001\myshop-test\myshop_background\apps\users\apps.py
寫入以下代碼:
from datetime import datetime
from django.db import models
from django.contrib.auth.models import AbstractUser, Group, Permissionclass MyUser(AbstractUser):SEX = ((0, '男'),(1, '女'),)LEVEL = ((1, '寂寞卡會員'),(2, '鉆石卡會員'),(3, '金卡會員'),(4, '銀卡會員'),)STATUS = ((0, '正常'),(1, '異常'),)groups = models.ManyToManyField(Group,verbose_name='groups',blank=True,help_text='The groups this user belongs to.',related_name='user_groups' # 設(shè)置不同的 related_name)user_permissions = models.ManyToManyField(Permission,verbose_name='user permissions',blank=True,help_text='Specific permissions for this user.',related_name='user_permissions' # 設(shè)置不同的 related_name)truename = models.CharField('真實姓名', blank=True, max_length=50)mobile = models.CharField('手機號碼', max_length=11, default="")sex = models.IntegerField(default=0, choices=SEX)birthday = models.DateField(blank=True, null=True)user_img = models.ImageField("頭像", upload_to="user_img", default="")level = models.IntegerField(default=4, choices=LEVEL)status = models.IntegerField(default=0, choices=STATUS)create_time = models.DateTimeField(default=datetime.now, verbose_name='創(chuàng)建時間')update_time = models.DateTimeField(default=datetime.now, verbose_name="更新時間")def __str__(self):return self.usernameclass Meta(AbstractUser.Meta):permissions = (['check_myuser', '審核用戶信息'],)
①關(guān)于字段groups和字段user_permissions的說明。
字段groups和字段user_permissions實際上是沒有作用的,那為什么要定義呢?原因請見博文:https://blog.csdn.net/wenhao_ir/article/details/131773627
②問:能不能介紹下代碼from django.contrib.auth.models import AbstractUser
中涉及到的類AbstractUser?
答:在Django框架中,django.contrib.auth.models
模塊提供了用于身份驗證和授權(quán)的相關(guān)功能。其中,AbstractUser
類是Django默認的用戶模型(user model)的抽象基類。詳情請參見鏈接:https://blog.csdn.net/wenhao_ir/article/details/131594115
③代碼 truename=models.CharField(‘真實姓名’,blank=True,max_length=50) 的blank=True,
是什么意思?
在Django模型中,blank=True
是一個參數(shù),用于指示模型字段是否可以為空。當blank=True
時,該字段在表單驗證過程中可以為空,不會引發(fā)驗證錯誤。如果blank=False
,則該字段在表單驗證過程中是必需的,不能為空。
在代碼中,truename
是一個CharField
,它表示一個字符型字段,用于存儲真實姓名。由于指定了blank=True
,這意味著在創(chuàng)建或更新該模型實例時,可以將truename
字段留空。這對于某些情況下真實姓名是可選的場景很有用。但需要注意的是,即使blank=True
,數(shù)據(jù)庫中存儲的字段值仍然可以是空字符串,而不是NULL
值。
④代碼 mobile=models.CharField(‘手機號碼’,max_length=11,default=“”)中的 default=“” 是什么意思?
答:default=""
是models.CharField
的一個參數(shù),用于指定字段的默認值。
default=""
表示當創(chuàng)建新的模型實例時,如果沒有為mobile
字段提供具體的值,那么該字段將默認為空字符串。
在數(shù)據(jù)庫中,如果沒有為該字段提供值,它將被存儲為空字符串,而不是NULL
值。這意味著在查詢和檢索數(shù)據(jù)時,如果mobile
字段沒有被顯式地賦值,它將返回空字符串作為默認值。
通過設(shè)置默認值,可以確保即使沒有為該字段提供值,模型實例的mobile
字段始終有一個默認的空字符串值。這在某些情況下可能是有用的,例如當手機號碼是可選的字段時,可以將其默認為空字符串。
注意:如果在代碼mobile=models.CharField('手機號碼',max_length=11)
中不指定default
參數(shù)或?qū)⑵湓O(shè)置為default=None
,則在創(chuàng)建新的模型實例時,如果沒有為mobile
字段提供具體的值,該字段將默認為NULL
值。
⑤語句 sex = models.IntegerField(default=0,choices=SEX) 的理解:
這個代碼中的choices=SEX
定義了一個選項列表,其中每個選項都由一個值和對應(yīng)的顯示標簽組成。在這個例子中,SEX
是一個包含元組的元組,每個元組有兩個元素,第一個是存儲的值,第二個是顯示的標簽。
在數(shù)據(jù)庫中,sex
字段將使用整數(shù)存儲,而不是字符串。當你在創(chuàng)建或更新對象時,可以使用這些選項中的任何一個值來表示性別。數(shù)據(jù)庫中存儲的是相應(yīng)的整數(shù)值(0代表男,1代表女),但是在界面上或其他需要顯示的地方,你可以使用元組中的顯示標簽(‘男’和’女’)來表示。
也就是說如果我寫入一個值,這個值是字符串’男’,那么寫入數(shù)據(jù)庫的是整數(shù)0哈。
⑥語句 user_img=models.ImageField(“頭像”,upload_to=“user_img”,default=“”) 的 upload_to=“user_img” 是什么意思?
答:在Django中,上傳路徑可以在模型字段的定義中通過upload_to
參數(shù)設(shè)置,也可以通過Django的配置文件進行全局設(shè)置。
-
模型字段中的設(shè)置:
在定義模型字段時,可以使用upload_to
參數(shù)來指定上傳路徑。例如:from django.db import modelsclass MyModel(models.Model):image = models.ImageField(upload_to='my_upload_path/')
上述代碼中,
upload_to
參數(shù)設(shè)置為'my_upload_path/'
,表示上傳的文件將保存在MEDIA_ROOT/my_upload_path/
路徑下,其中MEDIA_ROOT
是在Django的配置文件中設(shè)置的媒體文件根路徑。 -
全局配置文件中的設(shè)置:
Django還提供了一個全局配置文件settings.py
,可以在其中設(shè)置默認的上傳路徑。在配置文件中,可以使用MEDIA_ROOT
和MEDIA_URL
兩個設(shè)置來定義上傳文件的根路徑和對應(yīng)的URL。例如:# settings.pyMEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
上述配置中,
MEDIA_ROOT
指定了媒體文件的根路徑為BASE_DIR/media
,MEDIA_URL
指定了該路徑對應(yīng)的URL為/media/
。在模型字段中不指定upload_to
參數(shù)時,文件將被保存在MEDIA_ROOT
設(shè)置的路徑下。關(guān)于BASE_DIR
的詳細介紹,請參考我的另一篇博文:https://blog.csdn.net/wenhao_ir/article/details/131598936
需要注意的是,在使用MEDIA_ROOT
和MEDIA_URL
進行設(shè)置時,確保在Django的URL配置中包含了相應(yīng)的URL映射,以便可以正確地訪問上傳的文件。
⑦內(nèi)部類Meta是什么東西?
關(guān)于這個問題的答案,請參見我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/131600645
04-02-goods的模型創(chuàng)建及代碼詳解
04-02-1-拷貝common文件夾
把下面的common文件夾拷貝到根目錄 E:\Python_project\P_001\myshop-test\good_info 中。
https://pan.baidu.com/s/115vpHu68sR3vDJqvBHuFUg?pwd=g9ow
在 common 目錄下有文件base_model.py:
文件base_model.py的內(nèi)容如下:
from django.db import modelsclass BaseModel(models.Model):"""抽象基類"""create_time = models.DateTimeField(auto_now_add=True, verbose_name="創(chuàng)建時間")update_time = models.DateTimeField(auto_now=True, verbose_name="更新時間")class Meta:# 指定抽象基類abstract = True
注意:在這個抽象基類中定義了字段“create_time”和“update_time ”。
04-02-2-代碼寫入模型文件 goods\models.py
打開文件:E:\Python_project\P_001\myshop-test\good_info\goods\models.py
定入下面的代碼:
from django.db import models
from datetime import datetimefrom users.models import MyUser
from common.base_model import BaseModelclass GoodsCategory(BaseModel):id = models.AutoField(primary_key=True)name = models.CharField(max_length=50, verbose_name='分類名稱', default='')parent = models.ForeignKey("self", null=True, blank=True, verbose_name="父類", on_delete=models.DO_NOTHING, related_name="sub_cat")is_nav = models.BooleanField(default=False, verbose_name='是否顯示在導航欄')sort = models.IntegerField(verbose_name='排序')def __str__(self):return self.nameclass Meta:verbose_name = '商品分類'verbose_name_plural = '商品分類'db_table = 'd_goods_category' # 在數(shù)據(jù)庫中的表名class Goods(models.Model):STATUS = ((0, '正常'),(1, '下架'),)name = models.CharField(max_length=50, verbose_name='商品名稱', default='')category = models.ForeignKey(GoodsCategory, blank=True, null=True, verbose_name='商品分類', on_delete=models.DO_NOTHING)market_price = models.DecimalField(max_digits=8, default=0, decimal_places=2, verbose_name='市場價格')price = models.DecimalField(max_digits=8, decimal_places=2, default=0, verbose_name='實際價格')unit = models.CharField(max_length=10, verbose_name='計量單位', blank=True, null=True)click_num = models.IntegerField(default=0, verbose_name="點擊數(shù)")amount = models.IntegerField(default=0, verbose_name="銷售量")stock_num = models.IntegerField(default=0, verbose_name="庫存數(shù)")fav_num = models.IntegerField(default=0, verbose_name="收藏數(shù)")goods_desc = models.CharField(max_length=200, verbose_name='商品詳情', default='',)status = models.IntegerField(default=0, choices=STATUS)is_recommend = models.BooleanField(default=False, verbose_name="是否推薦")user = models.ForeignKey(MyUser, blank=True, null=True, verbose_name="用戶", on_delete=models.DO_NOTHING)createDate = models.DateTimeField(default=datetime.now, verbose_name='創(chuàng)建時間')def __str__(self):return self.nameclass Meta:verbose_name = '商品信息'verbose_name_plural = '商品信息'db_table = 'd_goods' # 在數(shù)據(jù)庫中的表名
下面這句代碼的理解請參考博文 https://blog.csdn.net/wenhao_ir/article/details/131708665
parent = models.ForeignKey("self", null=True, blank=True, verbose_name="父類", on_delete=models.DO_NOTHING, related_name="sub_cat")
05-創(chuàng)建數(shù)據(jù)庫
數(shù)據(jù)庫名:goodtest01
數(shù)據(jù)庫用戶名:goodtest01
數(shù)據(jù)庫密碼:aa123456
06-配置setting.py文件中的數(shù)據(jù)庫信息
打開文件:E:\Python_project\P_001\myshop-test\good_info\good_info\settings.py
寫入下面的數(shù)據(jù)庫配置信息:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'goodtest01','USER': 'goodtest01','PASSWORD': 'aa123456','HOST': 'localhost','PORT': '3306',# 取消外鍵約束,否則多對多模型遷移報django.db.utils.IntegrityError: (1215, 'Cannot add foreign key constraint')'OPTIONS': {"init_command": "SET foreign_key_checks = 0;",'charset': 'utf8'},}
}
07-創(chuàng)建模型遷移和執(zhí)行模型遷移命令
首先請把數(shù)據(jù)庫打開。
首先請把數(shù)據(jù)庫打開。
首先請把數(shù)據(jù)庫打開。
然后執(zhí)行下面的命令。
CD E:\Python_project\P_001\myshop-test\good_info\
E:
manage.py makemigrations
manage.py migrate
E:\Python_project\P_001\myshop-test\good_info>manage.py makemigrations
Migrations for 'goods':goods\migrations\0001_initial.py- Create model GoodsCategory- Create model Goodsgoods\migrations\0002_goods_user.py- Add field user to goods
Migrations for 'users':users\migrations\0001_initial.py- Create model MyUser
08-創(chuàng)建后臺管理員用戶
運行下面的命令:
CD E:\Python_project\P_001\myshop-test\good_info\
E:
manage.py createsuperuser
從上面的過程來看,如果不指定管理員的用戶名,則默認為:administrator,同時還可以輸入管理員的郵箱。
我在上面設(shè)的密碼為:bb123456
09-啟動后臺web服務(wù)并測試是否能登陸管理員帳戶
運行下面這三條命令啟動:
CD E:\Python_project\P_001\myshop-test\good_info\
E:
python manage.py runserver
訪問下面這個URL進入Django自帶的后臺登陸頁面:
http://127.0.0.1:8000/admin/
輸入用戶名(administrator)和密碼(bb123456),登陸:
10-配置Admin后臺管理系統(tǒng)
10-1-配置 goods/app.py 文件
把 goods/app.py 文件原來的代碼:
from django.apps import AppConfigclass GoodsConfig(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'goods'
改成下面這樣:
from django.apps import AppConfigclass GoodsConfig(AppConfig):default_auto_field = 'django.db.models.BigAutoField'name = 'goods'verbose_name = "商品管理"
即加上代碼verbose_name = "商品管理"
,這樣“商品管理”會顯示在Admin后臺管理系統(tǒng)中的左側(cè)菜單導航中。
10-2-設(shè)置 goods/__init__.py
文件
在goods/__init__.py
文件中寫入下面的代碼:
from .apps import GoodsConfig
default_app_config = 'goods.GoodsConfig'
關(guān)于語句:from .apps import GoodsConfig
的解釋如下:
在Django中,.apps
是指從當前包(package)【也可以理解為當前目錄】中導入一個名為apps
的模塊(module)或子包(sub-package)。在上面的代碼中,from .apps import GoodsConfig
的作用是從當前目錄的apps模塊中導入類 GoodsConfig 。
.apps
用于從當前包中導入GoodsConfig
。
具體來說,Django的應(yīng)用(app)通常是一個包含apps.py
文件的Python包。apps.py
文件用于定義Django應(yīng)用的配置類,其中包含應(yīng)用的元數(shù)據(jù)信息,例如應(yīng)用名稱、顯示名稱等。通常情況下,Django會自動生成apps
模塊,你可以通過導入它來訪問應(yīng)用的配置類。
假設(shè)你的項目結(jié)構(gòu)如下:
my_project/my_app/__init__.pyapps.pymodels.pyviews.py
在apps.py
中,可能會定義類似如下的應(yīng)用配置類:
# my_project/my_app/apps.pyfrom django.apps import AppConfigclass GoodsConfig(AppConfig):name = 'my_app'verbose_name = 'My Goods Application'
現(xiàn)在,如果你想在其他文件中引用GoodsConfig
這個配置類,可以使用相對導入的方式,如下所示:
# 任何其他.py文件from .apps import GoodsConfig# 使用GoodsConfig進行配置或其它操作
在這里,.apps
表示當前包(my_app
)中的apps
模塊,然后從中導入了GoodsConfig
類。注意,apps
這個名稱是由Django約定的,用于表示應(yīng)用的配置模塊。
總之,.apps
在這里是一個相對導入的語法,用于引用當前包中的apps
模塊,并從中導入GoodsConfig
類。
關(guān)于語句:default_app_config = 'goods.GoodsConfig'
的解釋如下:
在Django中,default_app_config
變量用于指定一個應(yīng)用的默認配置類。當一個Django應(yīng)用被加載時,它將查找該應(yīng)用的apps.py
文件,并在其中尋找繼承自AppConfig
的配置類(如果存在的話)。然后,Django將使用該配置類來配置應(yīng)用的行為和元數(shù)據(jù)。
然而,有時候你可能希望在應(yīng)用的apps.py
文件中定義配置類,但不希望Django自動使用它作為默認的應(yīng)用配置。這種情況下,你可以手動指定默認的配置類,而不是讓Django自動識別。
在你提供的代碼中,default_app_config = 'goods.GoodsConfig'
的作用是明確指定應(yīng)用goods
使用GoodsConfig
作為其默認配置類。這樣做的好處是,即使Django自動檢測到其他配置類,它也會優(yōu)先選擇使用GoodsConfig
作為該應(yīng)用的配置類。
舉例來說,假設(shè)你的應(yīng)用goods
有如下結(jié)構(gòu):
goods/__init__.pyapps.pymodels.py...
在apps.py
中定義了GoodsConfig
配置類:
# goods/apps.pyfrom django.apps import AppConfigclass GoodsConfig(AppConfig):name = 'goods'verbose_name = 'Goods Application'
然后在goods/__init__.py
中添加了default_app_config
變量:
# goods/__init__.pyfrom .apps import GoodsConfig
default_app_config = 'goods.GoodsConfig'
通過這樣的設(shè)置,你可以確保GoodsConfig
會被作為goods
應(yīng)用的默認配置類。即使Django自動發(fā)現(xiàn)了其他配置類,也會忽略它們并使用GoodsConfig
。
需要注意的是,default_app_config
變量只有在應(yīng)用被加載之前設(shè)置才有效。在Django啟動時,它會讀取應(yīng)用的__init__.py
文件,找到default_app_config
變量并應(yīng)用它指定的配置類。因此,如果你在運行Django之前修改了該文件,確保default_app_config
的設(shè)置在Django加載應(yīng)用之前生效。
10-3-配置admin.py文件
在文件:E:\Python_project\P_001\myshop-test\good_info\goods\admin.py 中寫入下面的代碼:
from django.contrib import admin
from goods.models import *@admin.register(GoodsCategory)
class GoodsCategoryAdmin(admin.ModelAdmin):admin.site.site_title = "我的商城-標簽頁標題"admin.site.site_header = "我的商城-頁面標題"admin.site.index_title = "商城平臺管理-后臺管理主頁標題"# 設(shè)置列表中顯示的字段list_display = ['name', 'sort', 'create_time'] # 字段create_time定義在 from common.base_model import BaseModel 中# 搜索search_fields = ['name', 'parent_id']# 過濾list_filter = ['name', 'parent_id']# 設(shè)置每頁現(xiàn)實的數(shù)據(jù)量list_per_page = 10# 設(shè)置排序ordering = ['sort']@admin.register(Goods)
class GoodsAdmin(admin.ModelAdmin):# 設(shè)置列表中顯示的字段list_display = ['name', 'market_price', 'price']
代碼@admin.register(GoodsCategory)
是什么意思?
答:有兩個作用。
①在Django中,@admin.register()
是一個裝飾器(decorator),用于注冊數(shù)據(jù)庫模型類(Model)到后臺管理界面。具體來說,@admin.register(GoodsCategory)
這行代碼的作用是將 GoodsCategory
數(shù)據(jù)庫模型類注冊到Django后臺管理界面,從而允許您在后臺對該模型進行管理和操作。
一旦通過 @admin.register()
注冊了一個數(shù)據(jù)庫模型類,Django會自動創(chuàng)建一個對應(yīng)的管理頁面,該頁面允許您查看、添加、修改和刪除模型的實例。這樣,您就可以在后臺管理界面輕松地管理您的數(shù)據(jù)庫中的 GoodsCategory
數(shù)據(jù)。
②在上面的代碼中,GoodsCategoryAdmin
類被用作 GoodsCategory
模型的管理類,它繼承自 admin.ModelAdmin
。通過在該類中定義不同的屬性和方法,您可以自定義后臺管理界面的外觀和行為,例如定義要顯示的字段、搜索和過濾選項、排序規(guī)則等等。
11-重新啟動 Web服務(wù)及效果展示
CTRL+C結(jié)束掉之前啟動的Web服務(wù),然后重新啟動:
CD E:\Python_project\P_001\myshop-test\good_info\
E:
python manage.py runserver
訪問后臺管理:
http://127.0.0.1:8000/admin/
用戶名(administrator)和密碼(bb123456)
把上面的這幅截圖記為“Home圖”
點擊“Home圖”中的“商品信息”,界面如下:
點擊“Home圖”中的“商品分類”,界面如下:
點擊“Home圖”中的“商品信息”右邊的“+ Add”,界面如下:
點擊“Home圖”中的“商品分類”右邊的“+ Add”,界面如下:
12-寫入數(shù)據(jù)測試
12-1-創(chuàng)建一條“商品分類”數(shù)據(jù)
12-2-創(chuàng)建一條“商品信息”數(shù)據(jù)
13-整個Project的壓縮包下載鏈接
整個Project的壓縮包下載鏈接:
https://pan.baidu.com/s/1DwfwH79cE6SB67hZqa-Q3w?pwd=hyrd