如何定制Django管理网站
Django是一个适合有期限的完美主义者的Web框架。Django为程序员提供了定制这个管理站点的权力,以适应项目的要求或客户的需要。本教程将以Windows为导向。
前提条件
在我们开始之前,你应该具备以下条件。
- 在你的机器上安装了Python3。
- 在虚拟环境中安装了Django。
- 对Python3和Django有一定了解。
第1步 - 创建我们的Django应用程序
使用下面的命令为该项目创建一个虚拟环境。
$ py -m venv .venv
然后,使用下面的命令激活它。
$ .venv\Scripts\activate.bat
现在我们可以在虚拟环境中安装Django。
$ pip install django
现在执行下面的命令来创建Django项目。
$ django-admin startproject Custom
让我们切换到创建的目录Custom 。
$ cd Custom
在Custom ,让我们继续创建我们的Bookstore应用程序。
$ django-admin startapp Bookstore
然后,将Bookstore添加到settings.py 中已安装的应用程序中。
INSTALLED_APPS = [
# ...
'Bookstore' # new
]
第2步 创建模型
添加以下代码到你的models.py ,创建一些模型。
from django.db.models.deletion import CASCADE
class Category(models.Model):
cat_romance = "Romance"
cat_fantacy = "Fantacy"
cat_thriller= "Thriller"
cat_horror = "Horror"
cat_crime = "Crime"
cat_true_story= "True Story"
category = models.CharField(
max_length=100,
choices=(
(cat_crime, cat_crime),
(cat_fantacy, cat_fantacy),
(cat_horror, cat_horror),
(cat_romance, cat_romance),
(cat_thriller, cat_thriller),
(cat_true_story, cat_true_story)
)
)
def __str__(self):
return self.category
class Publisher(models.Model):
publisher_name = models.CharField(max_length=100)
publish_date = models.DateField
def __str__(self):
return self.publisher_name
class Author(models.Model):
gender_male = "Male"
gender_female = "Female"
gender_other = "Other"
name = models.CharField(max_length=100)
gender = models.CharField(max_length=100,
choices=(
(gender_female, gender_female),
(gender_male, gender_male),
(gender_other, gender_other)
)
)
country = models.CharField(max_length=100)
def __str__(self):
return self.name
class Details(models.Model):
book_name = models.CharField(max_length=100)
category = models.ForeignKey(Category, on_delete=CASCADE)
pages = models.IntegerField(default=1)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
Author = models.ForeignKey(Author, on_delete=CASCADE)
def __str__(self):
return self.book_name
现在我们可以通过添加以下几行代码,继续在admin.py 中注册我们的模型。
from django.db import models
from .models import Category, Publisher ,Details, Author
class categoryAdmin(admin.ModelAdmin):
pass
class publisherAdmin(admin.ModelAdmin):
pass
class detailsAdmin(admin.ModelAdmin):
pass
class authorAdmin(admin.ModelAdmin):
pass
admin.site.register(Category, categoryAdmin)
admin.site.register(Publisher, publisherAdmin)
admin.site.register(Details, detailsAdmin)
admin.site.register(Author, authorAdmin)
然后,我们可以使用下面的命令进行迁移。
$ py manage.py makemigrations
$ py manage.py migrate
现在,让我们创建一个超级用户,以便开始定制我们的管理网站。
$ py manage.py createsuperuser
现在,使用下面的命令运行开发服务器。
$ py manage.py runserver
现在,你可以使用超级用户凭证登录http://127.0.0.1:8000/admin/。
现在,继续在我们创建的字段中添加一些输入。
第3步 - 为模型设置复数文本
我们可以通过添加下面的代码到models.py 来改变模型类别和细节在管理网站上以复数出现的方式。
class Category(models.Model):
# ...
class Meta: #new
verbose_name_plural = "Categories"
class Details(models.Model):
# ...
class Meta: #new
verbose_name_plural = "Details"
第4步.改变Django管理的标题文本
要改变管理站点的标题文本,登录页面,以及我们书店的HTML标题标签,而不是,在urls.py ,添加以下代码。
#...
admin.site.site_header = "Custom bookstore admin"
admin.site.site_title = "Custom bookstore admin site"
admin.site.index_title = "Custom Bookstore Admin"
site_header 改变出现在登录页面和管理站点的Django管理文本。site_title 改变了添加到每个管理页面的<title> 的文本。
index_title 改变了我们网站的标题,该标题出现在管理主页列表视图的顶部。
第5步.删除默认组
比方说,我们想去掉Django管理网站中默认的群组应用。
我们将继续导入它,然后在admin.py 中取消注册。
from django.contrib.auth.models import Group # new
#...
admin.site.unregister(Group) # new
如果你愿意,你也可以通过同样的过程去取消用户的注册。
第6步 - 使用list_display
你可能还想让你的细节模型在变更列表页显示不止一列。为了添加其他字段,我们将不得不对admin.py 。
class detailsAdmin(admin.ModelAdmin):
list_display=('book_name','category','Author','pages','publisher')
#pass
第7步.在Django管理中添加图片
我们可能还想用列表显示的方式在作者的名字之外添加作者的图片。要做到这一点,我们首先要安装一个名为pillow 的第三方应用程序。
使用终端,运行以下命令。
$ pip install pillow
然后,打开settings.py ,添加以下代码。这段代码告诉Django在哪里存储图片。
import os # at the top
#...
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR , 'media')
现在让我们创建媒体文件夹,并在其中添加一个图片文件夹。
$ mkdir media\images
然后,打开urls.py ,添加下面的代码,将我们的media 文件夹添加到静态文件中。
# below the other imports
from . import settings
from django.contrib.staticfiles.urls import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
#...
urlpatterns +=staticfiles_urlpatterns()
urlpatterns +=static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
在models.py ,我们将导入mark_safe ,同时将图像字段添加到我们的作者模型中。然后,我们将添加一个函数,使我们能够在我们的管理网站上查看图片。
# at the top
from django.utils.safestring import mark_safe
# in our Author model
class Author(models.Model):
# .....
author_pic = models.ImageField(upload_to='images/', null=True)
def image_tag(self):
return mark_safe('<img src="/../../media/%s" width="150" height="150" />' % (self.author_pic))
image_tag.allow_tags = True
现在让我们进行迁移,然后迁移以反映我们数据库中的变化。
$ py manage.py makemigrations
$ py manage.py migrate
最后,我们将在列表显示里面调用我们的函数。让我们到我们的admin.py ,修改authorAdmin() 。
class authorAdmin(admin.ModelAdmin):
list_display=['name','image_tag']
现在,运行开发服务器,享受变化。
这就是你如何定制Django管理工具的方法。