您的位置:首页 > 编程语言 > Go语言

使用django做管理后台

2014-01-12 01:36 555 查看
这里使用的是 django 1.3

django 的admin非常方便,

目录结构中有 manage.py 启动文件 urls.py 路由配置 settings.py 各种配置写在这里

比如可以python manage.py runserver 127.0.0.1:8000 ,此时我们可以打开127.0.0.1:8000进入后台管理界面。

1.管理后台的数据模型与展示模板

django是将我们定义的数据表映射为一个 编辑页面。对此首先要定义数据模型。

#coding=utf-8
from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Blog(models.Model):
title=models.CharField(u"标题",max_length=60)
content=models.TextField(u"正文")
user=models.ForeignKey(User,verbose_name=u"作者")
category=models.CharField(u"类型",max_length=20)
status=models.NullBooleanField(u"可用")
created_at=models.DateTimeField(u"建立时间",auto_now_add=True)
updated_at=models.DateTimeField(u"修改时间",auto_now=True)

class Meta:
verbose_name        = u"A.博客"
db_table = "blog_table_name"
 verbose_name_plural = u"A.博客列表"
ordering            = ("-created_at",)
get_latest_by       = "created_at"

def __unicode__(self):
return self.title


管理后台一般是admin.py 文件中。

admin.site.register(Blog)

我们可以把这个Blog 的数据表模型注册到管理后台中,这样在浏览Blog的目录列表时默认展示的是 __unicode__ 或者 __str__ 函数的返回值,如果对其具体操作,则可以点击链接进去。然后我们可以更自由的定义它在管理后台怎么展示,可以定义一个

#coding=utf-8
from django.contrib import admin
from models import Blog

class BlogAdmin ( admin.ModelAdmin ) :
list_display = ( 'user', 'title','category','status', 'created_at','updated_at',)#展示这些字段,这要和models中定义的Blog定义的一样
list_display_links =('title',) #点击这个项进入编辑页,如果不设置则默认是点击ID项
list_filter = ( 'user','title','status', 'created_at', 'updated_at',)
ordeing = ( '-created_at' ,  '-updated_at',)#展示时默认排序方式,字段前加符号-,代表降序排列
search_fields = ( 'title', 'user','content',)#搜索字段,输入的值会在这3个字段中搜寻

admin.site.register ( Blog, BlogAdmin )#定制我们自己的展示页面


2.自定义action操作

默认的action操作是,删除所选项。当然我们也可以定制。不同版本的django写的方法不一样。苦逼的是我们还是只能用django 1.3.1版本。

action 定义在 ModelAdmin 中,

class GuideAdmin(admin.ModelAdmin):
list_display = (
'id', 'game_id', 'game_name', 'other_platform_game_name', 'game_class',
'category', 'title', 'article_id', 'has_img', 'has_video', 'read_count',
'is_senior', 'senior_title', 'senior_image_urn', 'enable', 'create_time')
search_fields = ('article_id', 'game_name', 'other_platform_game_name')
list_display_links = ('game_name', 'title')
list_per_page = 20
raw_id_fields = ('category',)
list_filter =  ['game_class', 'enable', 'category', 'game_id']
actions_selection_counter = True

actions = ['active_guide', 'forbidden_guide']  # 定义action

def active_guide(self, request, queryset):

"""
启用攻略
"""
guide_ids = request.POST.getlist('_selected_action')
now = datetime.datetime.now()
success_count = 0
if guide_ids:
for guide_id in guide_ids:
guide = Guide.objects.filter(id=guide_id).get()
    # 使用 django的ORM 查询mysql
if guide and guide.game_id and guide.game_id > 0 and not guide.enable:
guide.update_time = now
guide.enable = True
guide.save()                                          #存储
success_count += 1
self.message_user(request, u"已启动%s个攻略." % success_count)
  #给用户的提示信息
active_guide.short_description = u'启用攻略'

def forbidden_guide(self, request, queryset):
#

change_form_template = 'backend/guide_change_form.html'
 #如果要使用自定义的模板,则需此定义

def change_view(self, request, object_id, extra_context=None):
extra_context = {'ext_form_url': request.path,
'HTTP_REFERER': request.META.get('HTTP_REFERER')}
  #点击编辑时的页面,这样可以在编辑完成后返回此页面
  
  result = super(GuideAdmin, self).change_view(request, object_id,
extra_context)
  #需要在模板页面中 <input type="hiden" value="{{HTTP_REFERER}}">

  result["Location"] = request.POST.get('HTTP_REFERER')
  #编辑完成后,跳转到 hidden中的地址
return result


3.过滤器

后台查询

django后台的过滤器。比如



filter , exclude 筛选出 queryset.

Blog.objects.filter(content__endswith="gausszh")

在要筛选的字段名后接双下划线和一些特定的词,比如上表的.

对于比较复杂的条件查询,可以用Q语句.

from django.db.models import Q

Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)


相当于如下的sql

SELECT * from polls WHERE question LIKE 'Who%'
AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')


4.cache

每个 QuerySets都有cache ,以减少向db的查询.但是QuerySets的结果要全部计算出来的时候才能用cache.django orm 采用懒惰的计算方式,使用的时候才向db正式取数据.

qs = Blog.objects.all()
qs[5]
qs[5] 需要两次链接
======
qs = Blog.objects.all()
[a.content for a qs]   向数据库发起连接,将所有结果计算出来
qs[5]   从cache中取
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: