[Django系列]13.上下文管理和后台管理

如果多个模板之间,如果需要共享东西,就需要用到上下文渲染器用.

1.上下文渲染器

获取访问的电脑IP并渲染到页面上!
传统的方法是:
在主页视图函数中,将传递的上下文改为{'ip_address':request.META['REMOTE_ADDR']},其中request.META[‘REMOTE_ADDR’]是获取请求的访问者IP.
#views.py
def index(request):
    # username = request.session.get('username',None)
    # user = AccountModel.objects.filter(username=username).first()if hasattr(request,'frontuser'):
        print '------------------'
    else:
        print '++++++++++++++++++'
    #return render(request,'index.html',{'user':'','comment':''})
    return render(request,'index.html',{'ip_address':request.META['REMOTE_ADDR']})
相应的HTML模板也要改增加{{ ip_address }}标签变量
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>爱存不存(ICBC)首页</title>
</head>
<body>
  当前登陆的ip地址是:{{ ip_address }}</br>
    {% if not frontuser %}
        <a href="{% url 'login' %}">登录</a>
        <a href="{% url 'regist' %}">注册</a>
    {% else %}
        <a href="#">{{frontuser.username}}</a>
    {% endif %}
    <a href="{% url 'transfer' %}">转账</a>
</body>
</html>
渲染出来的效果:

使用上下文渲染器方法:
首先需要在应用目录下,新建一个contextprocessors的包,里面新建一个文件叫做myprocessor.py

打开myprocessor.py文件,里面实际上是一个定义一个函数,但无论如何,必须要传requst作为参数,返回值必须是一个字典.
#accout/contextprocessor/mycontextprocessor.py
# coding:utf8
from account.models import AccountModel
# 1. 必须要传requst作为参数
# 2. 必须返回一个字典
def frontuser(request): #定义frontuser是用来检验是否登陆
    username = request.session.get('username',None) #从会话中获取用户名.
    user = AccountModel.objects.filter(username=username).first()  #查看是否是数据库中的用户
    if user:
        return {'frontuser':user} #用户存在,则返回frontuser:用户名的字典.
    else:
        return {}
def ip_address(request): #定义一个ip_address的方法,这个方法是返还request中的访问者ip地址的一个字典对象.
    return {'ip_address':request.META['REMOTE_ADDR']}
为了能够使用模板,还需要在对用的settings.py添加对用的文件
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'account.contextprocessor.mycontextprocessor.frontuser', #添加到这里
                'account.contextprocessor.mycontextprocessor.ip_address',
            ],
        },
    },
]
也可以得到上面需要的获取ip_address渲染到前台的效果.

2.后台用户管理

如何开启admin系统?
  • 在使用admin之前,要确保安装了一些东西
1. 确保在`settings.py`中的`INSTALLED_APPS`安装了`'django.contrib.admin'`
​
2. `INSTALLED_APPS`中添加了四个依赖的`app`:
INSTALLED_APPS = [
    'django.contrib.auth', # 用户授权的一个app,admin依赖这个app
    'django.contrib.contenttypes', # 这个是用来管理所有模型的app,admin和auth都依赖这个app
    'django.contrib.sessions', # sessions的app
    'django.contrib.messages', # 消息的app,一般开发者用得不多,但是auth这个app依赖这个app
]
3. 在模板上下文中添加以下依赖:
'context_processors': [
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
]
4. 在中间件中添加以下依赖:
MIDDLEWARE = [
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
]
Django自带后台管理,默认配置到urls.py中的url(r'^admin/', admin.site.urls),以方式访问
http://xxxx:oooo/admin

Django默认不会自带用户,所以要使用该功能,必须使用python manage.py createsuperuser创建超级用户.
  • 例如创建超级用户xiazai
G:\git\web\xtadmin>python manage.py createsuperuser  #使用createsuperuser命令创建超级用户
Username (leave blank to use 'xia'): xiazai #输入超级管理员的用户名,如果不输入,默认是当前的计算机名
Email address: #邮箱可为空
Password:      #密码不能设置过于简单
Password (again):
Superuser created successfully.
创建成功后,即可登陆,登录界面为

如果需要新增一个普通用户yangfan,步奏如下

3.使用admin管理后台数据

class ArticleModel(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    create_time = models.DateTimeField(null=True,auto_now_add=True)
    author = models.ForeignKey('AuthorModel',null=True)
    class Meta:
        # 1.看文章的权限
        # 2.修改文章的权限
        # 3.删除文章的权限
        # 4.发布文章的权限
        permissions = (
            ('watch_article',u'watch article'),
            ('update_article',u'修改文章的权限'),
            ('delete_article',u'删除文章的权限'),
            ('add_article',u'发布文章的权限'),
        )
    def __unicode__(self):
        return self.title
class AuthorModel(models.Model):
    name = models.CharField(max_length=100)
    gender = models.PositiveIntegerField()
    email = models.EmailField(null=True)
    def __unicode__(self):
        return u'%s/%s/%s' % (self.name,self.gender,self.email)
上面定义了2个数据库模型,ArticleModel(文章,包含字段title,content,create_time,author),AuthorModel(作者,name,gender,email)
3.1直接使用数据库models对象,返回unicode打印内容
如果需要将模型显示到后台,只需要2步操作:

1.导入数据库from models import ArticleModel,AuthorModel

2.注册admin.site.register(AuthorModel)

#xtadmin/admin.py
from django.contrib import admin
from models import ArticleModel,AuthorModel
admin.site.register(AuthorModel)

3.2 自定义models.Admin对象个性化显示
对书籍模型,自定义ArticleAdmin,个性化输出需要使用的内容
# -*- coding: utf-8 -*-
from django.contrib import admin #导入系统admin模块
from models import ArticleModel,AuthorModel #需要导入数据库模块
class ArticleAdmin(admin.ModelAdmin): #继承自admin.ModelAdmin模块
    list_display = ('title','author','create_time') #需要展示的字段,用元祖表示出来
    search_fields = ('title','content') #搜索框能检索到的字段
    list_filter = ('create_time','title') #能够过滤的字段
admin.site.register(ArticleModel,ArticleAdmin) #将自定义的admin模型和数据库模型关联起来.先数据库,后admin
admin.site.register(AuthorModel)

在models.py,增加以下代码,可以将上述的ArticleModel显示为指定的内容
#models.py
class Meta:
        verbose_name='书籍'
        verbose_name_plural='书籍'

3.3使用搜索,过滤器
括号中的元祖,是提供检索的字段
#models.py
search_fields = ('title','content') #可以提供搜索的查找项。
list_filter = ('create_time','title') #可以提供一个过滤的表。

总结

使用上下文渲染器,可以在一个模板定义全局的函数,这样在其他的视图函数里面,使用这个函数渲染上下文,对于多个需要使用同样函数来说,相当于共享了这个方法.Django的后台管理系统,是目前为止比较简单易用的后台管理,轻松几行代码便可以实现大部分功能.对于测试而言,绰绰有余.
赞(0)
未经允许不得转载:http://www.yueguangzu.net逗逗网 » [Django系列]13.上下文管理和后台管理
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址