如何定制Django管理网站

73 阅读3分钟

如何定制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管理工具的方法。