Python研究学习--24--Django框架(下)

版权声明:本文为博主原创文章,转载本站文章请注明作者和出处,请勿用于任何商业用途。 https://blog.csdn.net/wutianxu123/article/details/82562390

18.7 Django-Admin管理工具

1、新建工程

django-admin.py startproject zqxt_admin       #工程名为zqxt_admin

2、创建app

cd zqxt_admin                                 #进入 zqxt_admin 文件夹
python manage.py startapp blog                #创建 blog 这个 app

3、修改文件zqxt_admin\blog\models.py

# -*- coding: utf-8 -*-
from django.db import models

class Article(models.Model):
    title = models.CharField(u'标题', max_length=256)
    content = models.TextField(u'内容')
    pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True)

4、把blog加入到settings.py中:zqxt_admin\zqxt_admin\settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',                                   #新增的,和新建的APP名字一样。注意逗号
]

5、初始化数据表。理论上不需要,但实际测试中不初始化无法直接创建用户

python manage.py makemigrations               #进入包含有manage.py的文件夹
python manage.py migrate  

6、创建用户

PS D:\mypython\lalala> python manage.py createsuperuser
Username (leave blank to use 'memeda'): admin
Email address: 13324048888@163.com            #邮箱可以不填写
Password:12345678                             #这地方屏幕是不显示的,且有密码复杂度要求
Password (again):12345678
Superuser created successfully

7、修改admin.py在:zqxt_admin\blog\admin.py

# -*- coding: utf-8 -*-
#这三行代码就可以拥有一个强大的后台

from django.contrib import admin
from .models import Article

admin.site.register(Article)

8、开启服务并用浏览器访问进入管理页面

python manage.py runserver 0.0.0.0:8009       #也可以不写0.0.0.0:8009

http://localhost:8000/admin/                  #如果不写则默认8000

9、点击blog下的Articles可以手动添加文章标题和文章内容,但所有的文章标题都只叫Article object

10、修改zqxt_admin\blog\models.py使得文章标题可以正常显示

# -*- coding: utf-8 -*-
from django.db import models

class Article(models.Model):
    title = models.CharField(u'标题', max_length=256)
    content = models.TextField(u'内容')

    pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True)

    def __unicode__(self):                    #新加的函数,为了使得文章标题正确显示
        return self.title

11、一种兼容python2和python3的写法

# coding:utf-8
from __future__ import unicode_literals
from django.db import models

#python_2_unicode_compatible会自动做一些处理去适应python不同的版本
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible

class Article(models.Model):
    title = models.CharField('标题', max_length=256)
    content = models.TextField('内容')

    pub_date = models.DateTimeField('发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField('更新时间',auto_now=True, null=True)

    def __str__(self):
        return self.title

18.8 其他内容

1、在blog下增加一些新的标签

在zqxt_admin\blog\admin.py中进行修改

# -*- coding: utf-8 -*-
from django.contrib import admin
from .models import Article,Person

class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'pub_date', 'update_time',)
class PersonAdmin(admin.ModelAdmin):
    list_display = ('full_name',)

admin.site.register(Article, ArticleAdmin)
admin.site.register(Person, PersonAdmin)

在zqxt_admin\blog\models.py中进行修改

# -*- coding: utf-8 -*-
from django.db import models

class Article(models.Model):
    title = models.CharField(u'标题', max_length=256)
    content = models.TextField(u'内容')

    pub_date = models.DateTimeField(u'发表时间', auto_now_add=True, editable = True)
    update_time = models.DateTimeField(u'更新时间',auto_now=True, null=True)

    def __unicode__(self):
        return self.title

class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def my_property(self):
        return self.first_name + ' ' + self.last_name
        my_property.short_description = "Full name of the person"

    full_name = property(my_property)

即可看到这样的效果:
这里写图片描述

2、定制加载的列表, 根据不同的人显示不同的内容列表,比如输入员只能看见自己输入的,审核员能看到所有的草稿,这时候就需要重写get_queryset方法:

#admin\blog\admin.py文件

class MyModelAdmin(admin.ModelAdmin):
    def get_queryset(self, request):
        qs = super(MyModelAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        else:
            return qs.filter(author=request.user)

3、定制搜索功能

#admin\blog\admin.py文件

class PersonAdmin(admin.ModelAdmin):
    list_display = ('name', 'age')
    search_fields = ('name',)

    def get_search_results(self, request, queryset, search_term):
        queryset, use_distinct = super(PersonAdmin, self).get_search_results(request, queryset, search_term)
        try:
            search_term_as_int = int(search_term)
            queryset |= self.model.objects.filter(age=search_term_as_int)
        except:
            pass
        return queryset, use_distinct

4、修改保存时的一些操作,可以检查用户,保存的内容等,比如保存时加上添加人

#admin\blog\admin.py文件

from django.contrib import admin

class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.user = request.user
        obj.save()

其中obj是修改后的对象,form是返回的表单(修改后的),当新建一个对象时change = False, 当修改一个对象时change = True

如果需要获取修改前的对象的内容可以用:

#admin\blog\admin.py文件

from django.contrib import admin

class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj_original = self.model.objects.get(pk=obj.pk)
        obj.user = request.user
        obj.save()

那么又有问题了,这里如果原来的obj不存在,也就是如果我们是新建的一个怎么办呢,这时候可以用try,except的方法尝试获取,当然更好的方法是判断一下这个对象是新建还是修改,是新建就没有 obj_original,是修改就有:

#admin\blog\admin.py文件

from django.contrib import admin

class ArticleAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        if change:                                   #更改的时候
            obj_original = self.model.objects.get(pk=obj.pk)
        else:                                        #新增的时候
            obj_original = None

        obj.user = request.user
        obj.save()

5、删除时做一些处理

#admin\blog\admin.py文件

from django.contrib import admin

class ArticleAdmin(admin.ModelAdmin):
    def delete_model(self, request, obj):            #给定一个模型实例,从数据库中删除它
        obj.delete()                                 #操作这里的东西

猜你喜欢

转载自blog.csdn.net/wutianxu123/article/details/82562390