创建一个管理员用户

首先,我们需要创建一个用户可以登录到管理网站。 运行 下面的命令:

$ python manage.py createsuperuser

输入你想要的用户名,按回车。

Username: admin

您将被提示输入你想要的电子邮件地址:

Email address: admin@example.com

最后一个步骤是输入你的密码。 您将被要求输入你的 密码两次,第二次的确认。

Password: **********
Password (again): *********
Superuser created successfully.

启动开发服务器

Django管理网站默认激活。 让我们开始发展 服务器和探索它。

回忆一下第1教程,你开始开发服务器一样:

$ python manage.py runserver

现在,打开一个Web浏览器和去“/ admin /”在本地域中——例如, http://127.0.0.1:8000 /admin/ 。 您应该看到管理员的登录界面:

自 翻译 在默认情况下是开启的, 登录屏幕会显示在自己的语言中,这取决于你 浏览器的设置和Django是否已经翻译了这门语言。

不匹配你所看到的吗?

如果在这一点上,而不是上面的登录页面,你得到一个错误 报告类似页:

ImportError at /admin/
cannot import name patterns
...

然后你可能使用Django的版本不匹配 教程的版本。

进入管理网站

现在,试着登录您在前面步骤中创建的超级用户帐户。 您应该看到Django管理索引页:

您应该看到一些类型的可编辑的内容:组织和用户。 他们是 所提供的 django.contrib.auth 运,身份验证框架 Django。

在管理调查应用程序修改

但我们的调查应用程序在哪里? 这不是显示在管理索引页面。

只是一件事:我们需要告诉管理员 问题 对象有一个管理界面。 要做到这一点,打开 民意调查/ admin.py 文件,编辑它看起来像这样:

民意调查/ admin.py
from django.contrib import admin
from polls.models import Question admin.site.register(Question)

探索自由的管理功能

既然我们已经注册 问题 ,Django知道它应该显示在 管理索引页:

点击“问题”。 现在你的问题“改变列表”页面。 这个页面 显示数据库中所有的问题,让你选择一个改变它。 有“有什么事吗? 我们创建了第一个教程”问题:

点击“发生什么了? “问题编辑:

注意事项:

  • 表单自动生成的 问题 模型。
  • 不同的模型字段类型( DateTimeField CharField )对应于适当的HTML 输入小部件。 每个类型的字段在Django知道如何展示自己 管理。
  • 每一个 DateTimeField 得到免费的JavaScript 快捷方式。 日期得到一个“今天”快捷键,弹出式日历,和时间 一个“现在”快捷方式,方便弹出列表通常进入时间。

页面的底部部分给你两个选择:

  • ——保存更改保存并返回到这种类型的变更清单页面 对象。
  • 保存并继续编辑,保存更改并重新加载管理页面 这个对象。
  • 保存并添加另一个——保存更改并加载一个新的空白表格 类型的对象。
  • 删除,显示删除确认页面。

如果“发布日期”的值不匹配您创建的时候 问题在教程1中,这可能意味着你忘了设置正确的值 的 TIME_ZONE 设置。 改变它,重新加载页面并检查 正确的值。

改变“发布日期”,点击“今天”和“现在”的捷径。 然后 点击“保存并继续编辑。 ”然后单击“历史”在右上角。 您将看到一个页面列出所有更改通过Django管理这个对象, 时间戳和用户名的人的改变:

自定义管理形式

花几分钟惊叹您不必编写的所有代码。 通过 注册 问题 模型与 admin.site.register(提问) , Django能够构造一个默认形式表示。 通常,您会希望 自定义外观和管理形式是如何工作的。 你会这样做,告诉 Django的选择你想要注册的对象。

让我们看看这是如何工作的重新排序的字段编辑表单。 取代 的 admin.site.register(提问) 符合:

民意调查/ admin.py
from django.contrib import admin
from polls.models import Question class QuestionAdmin(admin.ModelAdmin):
fields = ['pub_date', 'question_text'] admin.site.register(Question, QuestionAdmin)

你会遵循这种模式,创建一个模型管理对象,然后把它作为 第二个参数 admin.site.register() ——任何时候你需要改变 管理对象的选择。

上面这个变化使得“发布日期”之前 “问题”字段:

这不是令人印象深刻的只有两个字段,但是许多管理形式 的字段,选择一个直观的可用性是一个重要的细节。

说到拥有很多字段的形式,您可能想要分裂形式 成自定义字段:

民意调查/ admin.py
from django.contrib import admin
from polls.models import Question class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date']}),
] admin.site.register(Question, QuestionAdmin)

每个元组的第一个元素 自定义字段 自定义字段的标题。 这就是我们现在的表单的外观:

你可以任意的HTML类分配给每个自定义字段。 Django提供了一个 “崩溃” 类显示一个特定的自定义字段开始崩溃了。 这是有用的,当你有一个长形式包含一个字段的数量 不常用的:

民意调查/ admin.py
from django.contrib import admin
from polls.models import Question class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
] admin.site.register(Question, QuestionAdmin)

添加相关对象

好的,我们有我们的问题管理页面。 但是一个 问题 有多个 选择 , admin页面没有显示的选择。

然而。

有两种方法来解决这个问题。 首先是注册 选择 管理就像我们对待 问题 。 这很简单:

民意调查/ admin.py
from django.contrib import admin
from polls.models import Choice, Question
# ...
admin.site.register(Choice)

现在“选择”是一个可用的选项在Django管理。 选择“添加”的形式 是这样的:

在这种形式中,“问题”字段是一个选择框包含的每一个问题 数据库。 Django知道 ForeignKey 应该是 代表在管理 <选择> 盒子。 在我们的例子中,只有一个问题 在这一点上存在。

还要注意旁边的“添加另一个“链接”的问题。 “每一个物体 ForeignKey 关系到另一个地方得到这免费。 当你点击“添加 另一个,“你会得到一个弹出窗口的“添加问题”的形式。 如果您添加一个问题 Django的窗口,然后单击“保存”,将保存到数据库并问题 动态地将其添加在“添加选择”选择的选择你 看着。

但是,真的,这是一种低效的方法添加 选择 对象系统。 它会更好,如果你能添加一个直接当您创建群的选择 问题 对象。 让我们实现它。

删除 注册() 呼吁 选择 模型。 然后,编辑 问题 登记代码阅读:

民意调查/ admin.py
from django.contrib import admin
from polls.models import Choice, Question class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3 class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline] admin.site.register(Question, QuestionAdmin)

这告诉Django:“ 选择 对象是编辑的 问题 管理页面。 通过 默认情况下,提供足够的字段3选择。”

加载“添加问题”页面看到看起来:

它的工作原理是这样的:有三个插槽,指定相关的选择 通过 额外的 ,每次你回来的“改变”页面 创建的对象,你得到另一个三个额外的插槽。

最后的三个当前槽你会发现一个“添加另一个选择” 链接。 如果你点击它,一个新的槽将被添加。 如果你想删除 添加槽,你可以点击右上角的X添加槽。 请注意 你不能删除原来的三名的位置。 这张图片显示了添加槽:

不过,一个小问题。 需要大量的屏幕空间来显示所有的 字段用于输入相关 选择 对象。 出于这个原因,Django提供 相关表格的方式显示内联对象;你只需要改变 的 ChoiceInline 宣言写道:

民意调查/ admin.py
class ChoiceInline(admin.TabularInline):
#...

与 TabularInline (而不是 StackedInline ), 相关对象显示在一个更紧凑,表格格式:

请注意,有一个额外的“删除? ”专栏,允许添加删除行 使用“添加另一个选择”按钮和行已经保存。

自定义管理改变列表

现在,admin页面的问题是看起来很好,让我们做一些调整 “改变列表”页面,显示系统中所有的问题。

此时的样子:

默认情况下,Django显示 str() 每个对象。 但有时它会 更有帮助如果我们可以显示单个字段。 要做到这一点,使用 按照list_display 管理选项,这是一个 元组显示的字段名称,列,在变化的列表页面 对象:

民意调查/ admin.py
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date')

此外,我们还包括 was_published_recently 自定义 方法从教程1:

民意调查/ admin.py
class QuestionAdmin(admin.ModelAdmin):
# ...
list_display = ('question_text', 'pub_date', 'was_published_recently')

现在的问题改变列表页面看起来像这样:

你可以点击列标题排序——除了那些值 情况下的 was_published_recently 头,因为排序输出 不支持的任意一个方法。 还请注意,列标题was_published_recently 默认情况下,方法的名称( 突显出替换为空格),每一行包含字符串 输出的表示。

你可以改善通过给方法(在 民意调查/ models.py )几 属性,如下:

民意调查/ models.py
class Question(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
was_published_recently.admin_order_field = 'pub_date'
was_published_recently.boolean = True
was_published_recently.short_description = 'Published recently?'

有关这些方法属性的更多信息,请参阅 按照list_display 

编辑你的 民意调查/ admin.py 文件,添加一个改进的 问题 改变列表页面:使用过滤器 list_filter 。 添加以下行来 QuestionAdmin :

list_filter = ['pub_date']

添加一个“过滤器”侧边栏,让人们过滤列表的变化 pub_date 字段:

显示过滤器的类型取决于你过滤字段的类型。 因为 pub_date 是一个 DateTimeField ,Django 知道要给予适当的过滤器选项:“任何日期”“今天”“过去7天,” “本月”、“今年”。

这是进展顺利。 让我们添加一些搜索功能:

search_fields = ['question_text']

添加一个搜索框顶部的变化列表。 当有人进入 搜索词,Django将搜索 question_text 字段。 您可以使用尽可能多的 领域你想——尽管因为它使用一个 就像 后面的查询 场景,搜索字段的数目限制在一个合理的数目 您的数据库更容易搜索。

现在也是一个不错的注意,改变列表给你免费的分页。 的 默认是每页显示100件。 改变 列表 分页 搜索 盒子 过滤器 date-hierarchies column-header-ordering 所有像你认为他们应该一起工作。

自定义管理

显然,“Django政府”每个管理页面的顶部 荒谬。 它只是占位符文本。

很容易改变,使用Django模板系统。 Django管理 是由Django本身,其接口使用Django的模板吗 系统。

项目的 模板

创建一个 模板 项目目录(目录 包含 jobs )。 模板可以生活在任何地方在你的文件系统 Django可以访问。 (运行Django无论用户服务器运行。) 然而, 保持你的模板内的项目是一个好习惯。

打开您的设置文件( mysite / settings.py ,记住)和添加一个 TEMPLATE_DIRS 设置:

mysite / settings.py
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

TEMPLATE_DIRS 是文件系统目录的iterable检查什么时候 加载Django模板;它是一个搜索路径。

现在创建一个目录 管理 内部 模板 ,复制 模板 管理/ base_site.html 在默认的Django admin Django模板目录的源代码本身 ( django / contrib / admin /模板 )到该目录。

Django源文件在哪里?

如果你有困难找到Django源文件所在的地方 在您的系统上运行以下命令:

$ python -c "
import sys
sys.path = sys.path[1:]
import django
print(django.__path__)"

然后,编辑文件和替换 { { site_header |默认值:_(“Django 政府”) } } (包括大 括号)用你自己的网站的名称在您认为合适的地方。 你应该结束了 一段代码:

{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">Polls Administration</a></h1>
{% endblock %}

我们用这种方法来教你如何覆盖模板。 在实际的 项目时,您可能会使用 的 django.contrib.admin.AdminSite.site_header 属性来更容易 使这个特殊定制。

这个模板文件包含大量的文本 { % 块 品牌 % } 和 { { 标题 } } 。 的 { % 和 { { 标签是Django的一部分 模板语言。 当Django呈现管理/ base_site.html ,这 将评估模板语言生成最终的HTML页面。 不要担心如果你不能现在——任何意义的模板 我们将深入研究Django模板语言教程3。

注意,Django的可以覆盖默认的管理模板。 来 覆盖一个模板,只是你做同样的事情 base_site.html - - - - - - 它从默认目录复制到您的自定义目录,并使 的变化。

定制你自己的 应用程序的 模板

聪明的读者可能会问:如果 TEMPLATE_DIRS 默认是空的, Django发现默认管理模板怎么样? 答案是, 默认情况下,Django自动查找 模板/ 子目录内 每个应用程序包中,用作后备(别忘了 django.contrib.admin 是一个应用程序)。

我们的调查应用程序不是很复杂,不需要定制的管理 模板。 但是如果它变得更加复杂,需要修改 Django的标准管理模板,它的一些功能,这将是 更合理的修改 应用程序的 模板,而不是那些 项目 。 这样,你可能包括调查应用程序在任何新的项目 并保证会找到所需的自定义模板。

看到 模板加载程序文档 更多的 Django是如何找到模板的信息。

自定义管理索引页面

同样,您可能想要定制的外观和感觉Django 管理索引页面。

默认情况下,它显示的所有应用程序 INSTALLED_APPS 已经 注册与管理应用程序,按字母顺序排列的。 你可能想要 进行重大改革的布局。 毕竟,该指数可能是 管理最重要的页面,它应该很容易使用。

模板定制 管理/ index . html 。 (做同样的事情 管理/ base_site.html 在前一节中——从默认的复制它 目录您的自定义模板目录。) 编辑该文件,你会看到它 使用一个模板变量 app_list 。 该变量包含每一个 安装Django应用程序,而不是使用硬编码的链接 特定对象管理页面,按照你自己的想法是最好的。

django 2的更多相关文章

  1. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  2. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

  3. django server之间通过remote user 相互调用

    首先,场景是这样的:存在两个django web应用,并且两个应用存在一定的联系.某些情况下彼此需要获取对方的数据. 但是我们的应用肯经都会有对应的鉴权机制.不会让人家随随便便就访问的对吧.好比上车要 ...

  4. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

  5. Mysql事务探索及其在Django中的实践(一)

    前言 很早就有想开始写博客的想法,一方面是对自己近期所学知识的一些总结.沉淀,方便以后对过去的知识进行梳理.追溯,一方面也希望能通过博客来认识更多相同技术圈的朋友.所幸近期通过了博客园的申请,那么今天 ...

  6. 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...

  7. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  8. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...

  9. Django

    一.Django 简介 Django 是一个由 Python 写成的开放源代码的 Web 应用框架.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是 CMS(内容管理系统) ...

  10. Django admin定制化,User字段扩展[原创]

    前言 参考上篇博文,我们利用了OneToOneField的方式使用了django自带的user,http://www.cnblogs.com/caseast/p/5909248.html , 但这么用 ...

随机推荐

  1. CentOS7安装Docker,运行Nginx镜像、Centos镜像

    摘要 总体思路:yum命令直接安装Docker,下载想要的镜像并启动 1.环境,CentOS7 Minimal 64位,Docker必须要64位的系统 2.通过yum命令直接安装,yum instal ...

  2. 多线程&NSObject&NSThread&NSOperation&GCD

    1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 2.NSOperation/NS ...

  3. __declspec(dllexport) & __declspec(dllimport)

    __declspec(dllexport) 声明一个导出函数,是说这个函数要从本DLL导出.我要给别人用.一般用于dll中 省掉在DEF文件中手工定义导出哪些函数的一个方法.当然,如果你的DLL里全是 ...

  4. Quick Trick About Using Dbms_Metadata With Forms_DDL In Oracle Forms

    Example is given below to fetch any Oracle objects DDL script using DBMS_Metadata.Get_DDL command in ...

  5. 安装 slowhttptest ddos攻击软件

    kali:apt-get install slowhttptest

  6. C语言中strdup函数使用方法

    头文件:#include <string.h> 定义函数:char * strdup(const char *s); 函数说明:strdup()会先用malloc()配置与参数s 字符串相 ...

  7. 高并发简单解决方案————redis队列缓存+mysql 批量入库(ThinkPhP)

    问题分析 问题一:要求日志最好入库:但是,直接入库mysql确实扛不住,批量入库没有问题,done.[批量入库和直接入库性能差异] 问题二:批量入库就需要有高并发的消息队列,决定采用redis lis ...

  8. 操作系统基础知识之————单线程(Thread)与多线程的区别

    单线程(Thread)与多线程的区别 (一)首先了解一下cpu: 随着主频(cpu内核工作时钟频率,表示在CPU内数字脉冲信号震荡的速度,等于外频(系统基本时间)乘倍频)的不断攀升,X86构架的硬件逐 ...

  9. HDU1542矩形面积并

    取出纵向边按x坐标排序,在y方向上建立线段树. 每次查询当前有效长度len,ans += len*(x[i]-x[i-1]); 其中len为T[rt].len; 查询完毕后更新y方向上线段树,入边+1 ...

  10. Git与Repo入门(转载)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAykAAADuCAIAAACyDd+sAAAAA3NCSVQICAjb4U/gAAAgAElEQVR4Xu ...