如何正确使用 django admin 美化

一步一步学Django_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
一步一步学Django
上传于||文档简介
&&简​单​地​一​步​一​步​学​D​j​a​n​g​o
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩47页未读,继续阅读
你可能喜欢5865人阅读
Django(18)
Python(67)
install xadmin
首先当然是安装xadmin了,通过命令:&pip install&django-xadmin&。安装完之后,需要在项目的settings中也把它加入到&INSTALL_APPS&中, 它还依赖另外两个组件:django-crispy-forms和django-reversion,前者是必装的(安装xadmin时会自动安装),后者是可选的。install_app中的代码如下:
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django_xmlrpc',
'crispy_forms',
'pingback',
'duoshuo',
django的admin可以去掉了。
配置xadmin
上面是安装,这里是配置,和admin的配置一样,只需要在urls.py里添加:
import xadmin
xadmin.autodiscover()
这里有个注意事项,你需要把admin的配置去掉,这俩admin可能存在冲突,会导致出错。不知道现在修复没有。不过这不重要了,有了xadmin,自带的admin就没有用武之地了。
第二项配置就是url的配置,这时的注意事项是,你要去掉admin的url,加入xadmin的url,这意味着&你在项目其他地方使用到的admin url的reverse代码需要修改,另外xadmin的更新和admin的更新url不同&这点也是很多人替换之后项目出现 admin namespace 不存在bug的原因。
url配置如下:
urlpatterns = patterns('',
url(r'^$', IndexView.as_view(), name='home'),
url(r'^xadmin/', include(xadmin.site.urls), name='xadmin'),
开始替换admin吧
如果你只是对admin进行了简单的配置, 你需要做的就是替换到自定义Admin的继承为&object&,替换admin.site.register为xadmin.site.register。一个简单的示例:
from django.contrib import admin
from django.core import urlresolvers
from .models import Post
class PostAdmin(admin.ModelAdmin):
search_fields = ('title', 'alias')
fields = ('content', 'summary', 'title', 'alias', 'tags', 'status',
'category', 'is_top', 'is_old', 'pub_time')
list_display = ('preview', 'title', 'category', 'is_top', 'pub_time')
ordering = ('-pub_time', )
save_on_top = True
def preview(self, obj):
url_edit = urlresolvers.reverse('admin:blog_post_change', args=(obj.id,))
return u'''
&span&&a href=&/%s.html& target=&_blank&&预览&/a&&/span&
&span&&a href=&%s& target=&_blank&&编辑&/a&&/span&
''' % (obj.alias, url_edit)
preview.short_description = u'操作'
preview.allow_tags = True
admin.site.register(Post, PostAdmin)
上面的代码,看起来定义了很多东西,其实只需要做三处替换就行。当然,&记得把admin.py更改为adminx.py&。
上面说了的如果你只是简单的配置,但是如果你自定义了一些方法的话怎么做呢?比如我自己的blog,我后台编辑的是restructure格式的文本,在保存时会转成html存到数据。具体代码如下,我重写了django admin的&save_model&方法:
from django.contrib import admin
from django.core import urlresolvers
from .models import Post
class PostAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
obj.author = request.user
if not obj.summary:
obj.summary = obj.content
if not obj.is_old:
obj.content_html = restructuredtext(obj.content)
obj.content_html = obj.content.replace('\r\n', '&br/&')
obj.content_html = re.sub(r&\[cc lang='\w+?'\]&, '&pre&', obj.content_html)
obj.content_html = obj.content_html.replace('[/cc]', '&/pre&')
obj.save()
因为xadmin虽然在属性上兼容了admin,但提供的接口和之前的admin并不一致,因此如果你有用到类似的方法你需要自行修改。那么你怎么能知道需要修改成那种接口呢(为什么save_model得修改成save_models)。这个就得去看代码了,文档现在还是很少。
因为xadmin的自定义Admin类都是继承自object,导致很多人不知道该如何去看xadmin的ModelAdmin到底提供了哪些接口。这里提供一个关键的线索,xadmin的ModelAdmin设计和Django的ClassBase View类似。它的List部分的管理,Edit部分的管理,还有其他的都在代码/xadmin/views/下面分别是list.py,edit.py,还有detail.py等模块
所提供的接口通过重写可以满足大多数的需求。
关于xadmin怎么替换django自带的admin,也就这些内容了,关键点就是属性上完全兼容,方法上得去看源代码。不过就算是你用Django自带的admin,也一样得去看源码,文档挺少。如果有真的打算对后台定制的需求的话,应该记住一句话,&代码就是最好的文档&。
记得替换xadmin/models.py以下一行代码:
django.VERSION[1] & 4改为4 & django.VERSION[1] & 7
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:730160次
积分:8316
积分:8316
排名:第1517名
原创:201篇
转载:149篇
评论:45条
(1)(6)(4)(12)(3)(4)(21)(2)(2)(5)(3)(9)(6)(7)(3)(7)(9)(2)(5)(2)(7)(8)(7)(4)(5)(1)(3)(4)(6)(7)(4)(1)(3)(8)(1)(1)(3)(3)(3)(14)(10)(16)(15)(5)(19)(26)(12)(1)(15)(13)(12)(1)第三方登录:如果您认为本站教程很有帮助,可以以鼓励翻译或写出更多高质量教程。
Django 后台
django的后台我们只要加少些代码,就可以实现强大的功能。与后台相关文件:每个app中的 admin.py 文件与后台相关。下面示例是做一个后台添加博客文章的例子:一,新建一个 名称为 zqxt_admin 的项目django-admin.py&startproject&zqxt_admin二,新建一个 叫做 blog 的app#&进入&zqxt_admin&文件夹
cd&zqxt_admin
#&创建&blog&这个&app
python&manage.py&startapp&blog注意:不同版本的 Django 创建 project 和 app 出来的文件会有一些不同三,修改 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)四,把 blog 加入到settings.py中的INSTALLED_APPS中INSTALLED_APPS&=&(
&&&&'django.contrib.admin',
&&&&'django.contrib.auth',
&&&&'django.contrib.contenttypes',
&&&&'django.contrib.sessions',
&&&&'django.contrib.messages',
&&&&'django.contrib.staticfiles',
&&&&'blog',
)提示:INSTALLED_APPS 是一个元组,每次加入新的app的时候,在后面都加一个逗号,这是一个好习惯。五,同步所有的数据表#&进入包含有&manage.py&的文件夹
python&manage.py&syncdb
注意:Django&1.7及以上的版本需要用以下命令
python&manage.py&makemigrations
python&manage.py&migrate可以看到:Creating tables ...Creating table django_admin_logCreating table auth_permissionCreating table auth_group_permissionsCreating table auth_groupCreating table auth_user_groupsCreating table auth_user_user_permissionsCreating table auth_userCreating table django_content_typeCreating table django_sessionCreating table blog_articleYou just installed Django's auth system, which means you don't have any superusers defined.Would you like to create one now? (yes/no): yesUsername (leave blank to use 'tu'): tuEmail address:&Password:&Password (again):&Superuser created successfully.Installing custom SQL ...Installing indexes ...Installed 0 object(s) from 0 fixture(s)如果是 Django 不主动提示创建管理员(Django 1.9不提示)用下面的命令创建一个帐号python&manage.py&createsuperuser六,修改 admin.py&进入 blog 文件夹,修改 admin.py 文件(如果没有新建一个),内容如下from&django.contrib&import&admin
from&.models&import&Article
admin.site.register(Article)只需要这三行代码,我们就可以拥有一个强大的后台!提示:urls.py中关于 admin的已经默认开启,如果没有,。七,打开 开发服务器python&manage.py&runserver
#&如果提示&8000&端口已经被占用,可以用&python&manage.py&runserver&8001&以此类推访问 &输入设定的帐号和密码, 就可以看到:点击 Articles,动手输入 添加几篇文章,就可以看到:我们会发现所有的文章都是叫 Article object,这样肯定不好,比如我们要修改,如何知道要修改哪个呢?我们修改一下 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):#&在Python3中用&__str__&代替&__unicode__
&&&&&&&&return&self.title我们加了一个 __unicode__ 函数,刷新后台网页,会看到:所以推荐定义 Model 的时候 写一个 __unicode__ 函数(或 __str__函数)技能提升:如何兼容python2.x和python3.x呢?示例如下:#&coding:utf-8
from&__future__&import&unicode_literals
from&django.db&import&models
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.titlepython_2_unicode_compatible 会自动做一些处理去适应python不同的版本,本例中的 unicode_literals 可以让python2.x 也像 python3 那个处理 unicode 字符,以便有更好地兼容性。八,在列表显示与字段相关的其它内容后台已经基本上做出来了,可是如果我们还需要显示一些其它的fields,如何做呢?from&django.contrib&import&admin
from&.models&import&Article
class&ArticleAdmin(admin.ModelAdmin):
&&&&list_display&=&('title','pub_date','update_time',)
admin.site.register(Article,ArticleAdmin)list_display 就是来配置要显示的字段的,当然也可以显示非字段内容,或者字段相关的内容,比如: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)在admin.py中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)到这里我们发现我们又有新的需求,比如要改 models.py 中的字段,添加一个文章的状态(草稿,正式发布),这时候我们就需要更改表,django 1.7以前的都不会自动更改表,我们需要用第三方插件 South,参见 。Django 1.7 及以上用以下命令来同步数据库表的更改python&manage.py&makemigrations
python&manage.py&migrate本节代码下载:&(基于Django 1.6,后台帐号 tu 密码 zqxt)&(基于 Django 1.9 后台帐号 tu 密码 ziqiangxuetang)其它一些常用的功能:搜索功能:search_fields = ('title', 'content',) 这样就可以按照 标题或内容搜索了筛选功能:list_filter = ('status',) 这样就可以根据文章的状态去筛选,比如找出是草稿的文章新增或修改时的布局顺序:有时候我们需要对django admin site进行修改以满足自己的需求,那么我们可以从哪些地方入手呢?以下举例说明:1.定制加载的列表, 根据不同的人显示不同的内容列表,比如输入员只能看见自己输入的,审核员能看到所有的草稿,这时候就需要重写get_queryset方法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)该类实现的功能是如果是超级管理员就列出所有的,如果不是,就仅列出访问者自己相关的2.定制搜索功能(django 1.6及以上才有)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_distinctqueryset 是默认的结果,search_term 是在后台搜索的关键词3.修改保存时的一些操作,可以检查用户,保存的内容等,比如保存时加上添加人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如果需要获取修改前的对象的内容可以用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,是修改就有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()4, 删除时做一些处理,from&django.contrib&import&admin
class&ArticleAdmin(admin.ModelAdmin):
&&&&def&delete_model(self,&request,&obj):
&&&&&&&&&&&
&&&&&&&&Given&a&model&instance&delete&it&from&the&database.
&&&&&&&&&&&
&&&&&&&&#&handle&something&here
&&&&&&&&obj.delete()Django的后台非常强大,这个只是帮助大家入门,更完整的还需要查看官方文档,如果你有更好的方法或不懂的问题,欢迎评论!参考:&
您的邮件地址:
错误详细描述:
自强学堂为提供的内容仅用于学习,测试和培训。实例可能为了更容易理解而简化。我们一直对教程,参考手册,在线实例保持修订,但是我们不能保证所有内容全部正确。通过使用本站进行学习随之而来的风险与本站无关。当使用本站时,代表您已接受了本站的使用条款和隐私条款。自强学堂是以学习和分享知识为目的,对任何法律问题及风险不承担任何责任。版权所有,保留一切权利。
自强学堂是用
技术开发的站点,托管在平台
Copyright &
Powered by 自强学堂 All Rights Reserved.
JavaScript
Server Side
JavaScript
服务器相关
浏览器脚本
服务器脚本如何正确使用 Django Admin_百度知道
如何正确使用 Django Admin
提问者采纳
views import LoginRequiredMixin
model = Article
fields = (&#39. 模式二, UpdateView
from braces. 事实上;review_num&#39, 又方便扩展, models和views结合起来使用.views.generic import CreateView, 二是以API框架的形式存在, 在ModelForm中修改验证在上面的例子中, CreateView):
model = Article
fields = (&#39:ArticleCreateView和ArticleUpdateView中设置model为Article两个view都基于Article model自动生成了ModelForm这些ModelForm的验证;new&title&#39, 在这些API形式的django项目中也用到了django forms, 因此Django admin和CBVs基本都基于forms使用;, 由于django forms的强大验证功能, 大多数Django API 框架都是用forms作为其验证的一部分, ')
class ArticleUpdateView(LoginRequiredMixin, &#39.pyreview_num&#39, 如果我们希望每篇article title的开头都是&title&#39, 那么应该怎么做呢;slug&#39, 我们可以花费很少的经历来完成庞大的工作.虽然django forms的学习需要花费一点时间;)正如以上代码中看到的一样. 模式一;;slug&#39Django forms使用容易, 是基于Article model中定义的field转换而来的3;, &#39, &#39. 下面我们就介绍几种和Django forms结合使用的模式;. django forms不仅仅是用来呈现HTML的, 他们最强的地方应该是他们的验证能力, UpdateView).1;.models import Article
class ArticleCreateView(LoginRequiredMviews: ModelForm和默认验证最简单的使用模式便是ModelForm和model中定义的默认验证方式的组合:# myapp&#47:2, 但你可能没有想到. Django Forms的强大之处有些django项目并不直接呈现HTML, 但如果将forms? 首先我们需要建立自定义的验证(validator)
来自团队:
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 django admin 美化 的文章

 

随机推荐