本教程继续Part1。我们将设置数据库,创建您的第一个模型,并快速介绍Django的自动生成的管理网站。
数据库设置
现在,编辑mysite/settings.py
。它是一个用模块级别变量表示Django配置的普通Python模块。
Django的默认数据库是SQLite。如果你是数据库初学者,或者你只是想要试用一下Django,SQLite是最简单的选择。 SQLite包含在Python中,所以你不需要另外安装其他任何东西。当然在你开始第一个真正的项目时,你可能想使用一个更健壮的数据库比如PostgreSQL来避免在未来遇到令人头疼的数据库切换问题。
如果你希望使用另外一种数据库,请配置合适的database binding,并在mysite/settings.py
的DATABASES ‘default’条目中修改以下的配置以匹配你的数据库连接的设置:
-
ENGINE-支持’django.db.backends.sqlite3’, ‘django.db.backends.postgresql_psycopg2’, ‘django.db.backends.mysql’或’django.db.backends.oracle’;
-
NAME-数据库的名称。如果你使用SQLite,数据库将是你计算机上的一个文件; 如果是这样的话,NAME应该是这个文件的绝对路径,包括文件名。默认值是os.path.join(BASE_DIR, ‘db.sqlite3’),它将文件保存在你项目的目录中;
-
如果不使用SQLite作为数据库,则必须添加其他设置,例如USER,PASSWORD和HOST。有关更多详细信息,请参阅DATABASES的参考文档。
注:如果你使用PostgreSQL或者MySQL,确保到此你已经建立好一个数据库。如果你使用SQLite,你不需要事先创建任何东西。
当你编辑mysite/settings.py
时,请设置TIME_ZONE为你自己的时区。
INSTALLED_APPS
中是Django实例中所有Django应用的名称。应用可以在多个项目中使用,而且你可以将这些应用打包和分发给其他人在他们的项目中使用。
INSTALLED_APPS
默认包含了一下应用:
-
django.contrib.admin —— 管理站点;
-
django.contrib.auth —— 用户认证系统;
-
django.contrib.contenttypes —— 用于内容类型的框架;
-
django.contrib.sessions —— 会话框架;
-
django.contrib.messages —— 消息框架;
-
django.contrib.staticfiles —— 管理静态文件的框架。
这些应用,默认包含在Django中,以方便通用场合下使用。
其中一些应用程序使用至少一个数据库表,所以我们需要在数据库中创建表,然后才能使用它们。为此,请运行以下命令:
migrate查看INSTALLED_APPS设置并根据mysite/settings.py文件中的数据库设置创建任何必要的数据库表,数据库的迁移还会跟踪应用的变化。你会看到对每次迁移有一条信息。如果你有兴趣,可以运行你的数据库的命令行客户端并输入dt (PostgreSQL), SHOW TABLES; (MySQL)或.schema (SQLite)来显示Django创建的表。
对于极简主义者来说:INSTALLED_APPS包含的默认应用用于常见的场景,但并不是每个人都需要它们。 如果你不需要它们中的任何一个或所有应用,可以在运行migrate之前从INSTALLED_APPS中自由地注释或删除相应的行。migrate 命令将只为INSTALLED_APPS中的应用运行数据库的迁移。
创建模型
现在定义该应用的模型——本质上,就是定义该模型所对应的数据库设计及其附带的元数据。
在这个投票应用中,我们将创建两个模型: Question和Choice。Question对象具有一个question_text(问题)属性和一个publish_date(发布时间)属性。 Choice有两个字段:选择的内容和选择的得票统计。 每个Choice与一个Question关联。
这些概念通过简单的Python类来表示。 编辑polls/models.py文件,并让它看起来像这样:
# polls/models.py
from django.db import models
class Question(models.Model):
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField(\'date published\')
class Choice(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
choice_text = models.CharField(max_length=200)
votes = models.IntegerField(default=0)
View Code
代码很简单。每个模型由一个子类django.db.models.Model的类表示。每个模型都有一些类变量,每个变量表示模型中的数据库字段。
每个字段由Field类的实例表示,例如,字符串类型字段的CharField和数据时间类型的DateTimeField。这告诉Django每个字段持有什么类型的数据。
每个字段实例的名称(例如question_text或pub_date)就是字段的名称,以机器友好的形式。您将在Python代码中使用此值,您的数据库将使用它作为列名称。
您可以使用字段的可选第一个位置参数来指定一个更通俗的名称。这在Django的一些内省部分中使用,它也可以作为文档。如果不提供此字段,Django将使用机器可读的名称。在这个例子中,我们只为Question.pub_date定义了一个通俗的名称。对于此模型中的所有其他字段,该字段的机器可读名称将足以作为其通俗名称。
有些Field类具有必需的参数。例如,CharField要求你给它一个max_length。这不仅在数据库模式中使用,而且在验证中使用。
Field还可以有各种可选参数;在上例中,我们将votes的默认值设置为0。
最后,使用ForeignKey定义关系。这告诉Django每个选择是与单个问题相关。 Django支持所有常见的数据库关系:多对一,多对多和一对一。
激活模型
上面那段简短的模型代码给了Django很多信息。 有了这些代码,Django就能够:
但是首先得在INSTALLED_APPS中添加此应用。
理念: Django应用程序是“即插式”的:您可以在多个项目中使用应用程序,并且您可以分发应用程序,因为他们不必绑定到给定的Django安装。
要在我们的项目中包含应用程序,我们需要在INSTALLED_APPS设置中添加对其配置类的引用。 PollConfig类位于polls/aps.py文件中,因此其虚线路径为“polls.apps.PollsConfig”。编辑mysite/settings.py文件,并将该虚线路径添加到INSTALLED_APPS设置。它看起来像这样:
# mysite/settings.py
INSTALLED_APPS = [
\'django.contrib.admin\',
\'django.contrib.auth\',
\'django.contrib.contenttypes\',
\'django.contrib.sessions\',
\'django.contrib.messages\',
\'django.contrib.staticfiles\',
\'polls.apps.PollsConfig\'
]
现在Django包含了polls应用,下面运行:
python manage.py makemigrations polls
将会看到如下输出:
Migrations for \'polls\':
polls\\migrations\\0001_initial.py:
- Create model Choice
- Create model Question
- Add field question to choice
通过运行makemigrations告诉Django,已经对模型做了一些更改(在这个例子中,你创建了一个新的模型)并且会将这些更改存储为迁移文件。
迁移是Django储存模型的变化(以及您的数据库模式),它们只是磁盘上的文件。如果愿意,你可以阅读这些为新模型建立的迁移文件;这个迁移文件就是polls/migrations/0001_initial.py。不用担心,Django不要求你在每次Django生成迁移文件之后都要阅读这些文件,但是它们被设计成可人为编辑的形式,以便你可以手工稍微修改一下Django的某些具体行为。
有一个命令可以运行这些迁移文件并自动管理你的数据库模式——migrate,我们一会儿会用到它。但是首先,让我们看一下迁移行为将会执行哪些SQL语句。sqlmigrate命令接收迁移文件的名字并返回它们的SQL语句:
python manage.py sqlmigrate polls 0001
你应该会看到类似如下的内容(为了便于阅读我们对它重新编排了格式):
BEGIN;
CREATE TABLE "polls_choice" (
"id" serial NOT NULL PRIMARY KEY,
"choice_text" varchar(200) NOT NULL,
"votes" integer NOT NULL
);
CREATE TABLE "polls_question" (
"id" serial NOT NULL PRIMARY KEY,
"question_text" varchar(200) NOT NULL,
"pub_date" timestamp with time zone NOT NULL
);
ALTER TABLE "polls_choice" ADD COLUMN "question_id" integer NOT NULL;
ALTER TABLE "polls_choice" ALTER COLUMN "question_id" DROP DEFAULT;
CREATE INDEX "polls_choice_7aa0f6ee" ON "polls_choice" ("question_id");
ALTER TABLE "polls_choice"
ADD CONSTRAINT "polls_choice_question_id_246c99a640fbbd72_fk_polls_question_id"
FOREIGN KEY ("question_id")
REFERENCES "polls_question" ("id")
DEFERRABLE INITIALLY DEFERRED;
COMMIT;
注意以下几点:
-
输出的具体内容会依据你使用的数据库而不同。 以上例子使用的数据库是PostgreSQL;
-
表名是自动生成的,由app的名字(polls)和模型名字的小写字母组合而成 —— question和choice(你可以重写这个行为);
-
主键(IDs)是自动添加的。 (你也可以重写这个行为);
-
按照惯例,Django会在外键的字段名后面添加 “_id”。(你依然可以重写这个行为);
-
外键关系由FOREIGN KEY约束显式声明。不用在意DEFERRABLE部分;它只是告诉PostgreSQL直到事务的最后再执行外键关联;
-
这些SQL语句是针对你所使用的数据库定制的,所以会为你自动处理某些数据库所特有的字段例如auto_increment (MySQL)、 serial (PostgreSQL)或integer primary key autoincrement (SQLite) 。在处理字段名的引号时也是如此 —— 例如,使用双引号还是单引号;
-
sqlmigrate命令并不会在你的数据库上真正运行迁移文件 —— 它只是把Django 认为需要的SQL打印在屏幕上以让你能够看到。 这对于检查Django将要进行的数据库操作或者你的数据库管理员需要这些SQL脚本是非常有用的。
如果你有兴趣,你也可以运行python manage.py check
;这将检查您的项目中的任何问题,而不进行迁移或触摸数据库。
现在,再次运行migrate以在你的数据库中创建模型所对应的表:
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
Rendering model states... DONE
Applying polls.0001_initial... OK
migrate命令会找出所有还没有被应用的迁移文件(Django使用数据库中一个叫做django_migrations的特殊表来追踪哪些迁移文件已经被应用过),并且在你的数据库上运行它们。就是使你的数据库模式和你改动后的模型进行同步。
迁移功能非常强大,可以让你在开发过程中不断修改你的模型而不用删除数据库或者表然后再重新生成一个新的 —— 它专注于升级你的数据库且不丢失数据。 我们将在本教程的后续章节对迁移进行深入地讲解,但是现在,请记住实现模型变更的三个步骤:
阅读django-admin 的文档来了解manage.py 工具能做的所有事情。
使用API
现在,进入Python的交互式shell,玩转这些Django提供给你的API。 使用如下命令来调用Python shell:
python manage.py shell
我们使用上述命令而不是简单地键入“python”进入python环境,是因为manage.py 设置了DJANGO_SETTINGS_MODULE
环境变量,该环境变量告诉Django导入mysite/settings.py文件的路径。
绕过manage.py: 果你不想使用manage.py,只要设置DJANGO_SETTINGS_MODULE 环境变量为 mysite.settings,启动一个普通的Python shell,然后建立Django:
>> import django
>> django.setup()
如果以上命令引发了一个AttributeError,可能是你使用了一个和本教程不匹配的Django版本。 你可能需要换一个老一点的教程或者换一个新一点的Django版本。
您必须从manage.py所在的同一目录运行python,或确保该目录在Python搜索路径中,这个import mysite才会成功。
当你进入shell后,尝试一下下面的API吧:
>>> from polls.models import Question, Choice # 导入我们写的模型类
# question为空
>>> Question.objects.all()
<QuerySet []>
# 新建一个Question
# 在默认设置文件中启用对时区的支持, Django推荐使用timezone.now()代替python内置的datetime.datetime.now()
>>> from django.utils import timezone
>>> q = Question(question_text="What\'s new?", pub_date=timezone.now())
# 调用save()方法,将内容保存到数据库中
>>> q.save()
# 默认情况,你会自动获得一个自增的名为id的主键
>>> q.id
1
# 通过python的属性调用方式,访问模型字段的值
>>> q.question_text
"What\'s new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
# 通过修改属性来修改字段的值,然后调用save方法进行保存。
>>> q.question_text = "What\'s up?"
>>> q.save()
# objects.all() 用于查询数据库内的所有questions
>>> Question.objects.all()
<QuerySet [<Question: Question object>]>
<Question: Question object>
对于这个对象是一个不可读的内容展示,你无法从中获得任何直观的信息。 让我们来修复这个问题,让Django在打印对象时显示一些我们指定的信息。编辑Question模型(在polls/models.py文件中)并添加一个str()方法给Question和Choice:
# polls/models.py
from django.db import models
from django.utils.encoding import python_2_unicode_compatible
@python_2_unicode_compatible # 当你想支持python2版本的时候才需要这个装饰器
class Question(models.Model):
# ...
def __str__(self):
return self.question_text
@python_2_unicode_compatible # 当你想支持python2版本的时候才需要这个装饰器
class Choice(models.Model):
# ...
def __str__(self):
return self.choice_text
View Code
在模型中添加__str __()
方法非常重要,不仅仅是为了方便您处理交互式提示时,而且在Django自动生成的管理界面中也能使用。
注意这些都是普通Python方法。让我们演示一下如何添加一个自定义的方法:
# polls/models.py
import datetime
from django.db import models
from django.utils import timezone
class Question(models.Model):
# ...
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
注意import datetime 和from django.utils import timezone分别引用Python 的标准datetime 模块和Django django.utils.timezone中时区相关的工具。如果你不了解Python中时区的处理方法,你可以在时区支持的文档中了解更多的知识
保存修改后,我们重新启动一个新的python shell python manage.py shell
,再来看看其他的API:
>>> from polls.models import Question, Choice
# 添加__str__() 后的效果.
>>> Question.objects.all()
<QuerySet [<Question: What\'s up?>]>
# Django提供了大量的关键字参数查询API
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What\'s up?>]>
>>> Question.objects.filter(question_text__startswith=\'What\')
<QuerySet [<Question: What\'s up?>]>
# 获取今年发布的问卷
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What\'s up?>
# 查询一个不存在的ID,会抛出异常
>>> Question.objects.get(id=2)
Traceback (most recent call last):
...
DoesNotExist: Question matching query does not exist.
# Django为主键查询提供了一个缩写:pk。下面的语句和Question.objects.get(id=1)效果一样.
>>> Question.objects.get(pk=1)
<Question: What\'s up?>
# 看看我们自定义的方法用起来怎么样
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
# 让我们试试主键查询
>>> q = Question.objects.get(pk=1)
# 显示所有与q对象有关系的choice集合,目前是空的,还没有任何关联对象。
>>> q.choice_set.all()
<QuerySet []>
# C创建3个choices.
>>> q.choice_set.create(choice_text=\'Not much\', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text=\'The sky\', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text=\'Just hacking again\', votes=0)
# Choice对象可通过API访问和他们关联的Question对象
>>> c.question
<Question: What\'s up?>
# 同样的,Question对象也可通过API访问关联的Choice对象
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
# API会自动进行连表操作,通过双下划线分割关系对象。连表操作可以无限多级,一层一层的连接。
# 下面是查询所有的Choices,它所对应的Question的发布日期是今年。(重用了上面的current_year结果)
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
# 使用delete方法删除对象
>>> c = q.choice_set.filter(choice_text__startswith=\'Just hacking\')
>>> c.delete()
有关模型关系的更多信息,请参阅Accessing related objects。有关如何使用双下划线通过API执行字段查找的更多信息,请参阅字段查找。有关数据库API的完整详细信息,请参阅我们的数据库API参考。
Django admin管理站点介绍
为您的员工或客户生成管理网站用来添加,更改和删除内容是繁琐的工作,不需要太多的创造力。因此,Django完全自动创建模型的管理界面。
Django是在一个新闻编辑室的环境中编写的,“内容发布者”和“公共”网站之间有着非常明确的区分。
网站管理员使用系统添加新闻故事,事件,体育等,并且该内容显示在公共网站上。
Django解决了为网站管理员创建统一界面以编辑内容的问题。管理网站不打算供网站访问者使用。
创建管理用户
首先,我们需要创建一个可以登录到管理网站的用户。运行以下命令:
python manage.py createsuperuser
输入用户名:
Username: admin
输入邮箱地址:
Email address: admin@example.com
最后一步是输入您的密码。您将被要求输入您的密码两次,第二次作为第一次确认。
Password: **********
Password (again): *********
Superuser created successfully.
启动开发服务器
Django的管理站点是默认启用的。 让我们启动开发服务器:
python manage.py runserver
现在,打开Web浏览器并转到您本地域的“/ admin /”,例如,http://127.0.0.1:8000/admin/。你应该会看到管理员的登录界面:
由于翻译是默认打开的,登录界面可能会以您自己的语言显示,具体取决于您的浏览器设置,以及Django是否有此语言的翻译。
进入admin站点
使用在上一步中创建的超级用户帐户登录。您应该会看到Django管理员索引页面:
您应该会看到几种类型的可编辑内容:组和用户。它们由django.contrib.auth提供,Django提供的认证框架。
使应用在管理站点可编辑
现在你还无法看到你的投票应用,必须先在admin中进行注册,告诉admin站点,请将poll的模型加入站点内,接受站点的管理。
打开polls/admin.py文件,加入下面的内容:
# polls/admin.py
from django.contrib import admin
from .models import Question
admin.site.register(Question)
浏览admin站点的功能
注册question模型后,刷新admin页面就能看到Question栏目:
点击“Questions”,进入questions的修改列表页面。这个页面会显示所有的数据库内的questions对象,你可以在这里对它们进行修改。看到下面的“What’s up?”了么?它就是我们先前创建的一个question,并且通过str方法的帮助,显示了较为直观的信息,而不是一个冷冰冰的对象类型名称。
点击What’s up?进入编辑界面:
这里需要注意的是:
-
这个表单是根据Question模型文件自动生成的;
-
模型中不同类型的字段(DateTimeField、CharField)会对应相应的html输入控件。每一种类型的字段,Django管理站点都知道如何显示它们;
-
每个DateTimeField字段都会有个方便的javascript快捷方式。Date有个“Today”的快捷键和一个弹出式日历,time栏有个“Now”的快捷键和一个列出常用时间选项的弹出式窗口。
在页面的底部,则是一些可选项按钮:
-
Save —— 保存更改,并返回当前类型对象的变更列表界面;
-
Save and add another:保存当前修改,并加载一个新的空白的当前类型对象的表单;
-
Save and continue editing:保存当前修改,并重新加载该对象的编辑页面;
-
delete:弹出一个删除确认页面
如果“Date published”字段的值和你在前面教程创建它的时候不一致,可能是你没有正确的配置TIME_ZONE,在国内,通常是8个小时的时间差别。修改TIME_ZONE配置并重新加载页面,就能显示正确的时间了
通过“Today”和“Now”这两个快捷方式来更改“Date published”字段。 然后点击 “Save and continue editing”。然后点击右上角的“History”按钮。 你将看到一个页面,列出了通过Django管理界面对此对象所做的全部更改的清单,包含有时间戳和修改人的姓名等信息:
到此,你对模型API和admin站点有了一定的熟悉,可以进入下一阶段的教程了。
快速通道
欢迎关注微信公众号: Pythoner每日一报
ios8muivneahhuaetu+8mzwvcD48cD4qIGRqYW5n
by5jb250cmliLm1lc3NhZ2VzIOKAlOKAlCDmtojmga/moYbmnrbvvJs8L3A+PHA+KiBkamFuZ28u
Y29udHJpYi5zdGF0aWNmaWxlcyDigJTigJQg566h55CG6Z2Z5oCB5paH5Lu255qE5qGG5p6244CC
PC9wPjxwPui/meS6m+W6lOeUqO+8jOm7mOiupOWMheWQq+WcqERqYW5nb+S4re+8jOS7peaWueS+
v+mAmueUqOWcuuWQiOS4i+S9v+eUqOOAgjwvcD48cD7lhbbkuK3kuIDkupvlupTnlKjnqIvluo/k
vb/nlKjoh7PlsJHkuIDkuKrmlbDmja7lupPooajvvIzmiYDku6XmiJHku6zpnIDopoHlnKjmlbDm
ja7lupPkuK3liJvlu7rooajvvIznhLblkI7miY3og73kvb/nlKjlroPku6zjgILkuLrmraTvvIzo
r7fov5DooYzku6XkuIvlkb3ku6TvvJo8L3A+PHA+YGBgPGJyPnB5dGhvbiBtYW5hZ2UucHkgbWln
cmF0ZTxicj5gYGA8L3A+PHA+bWlncmF0Zeafpeeci0lOU1RBTExFRF9BUFBT6K6+572u5bm25qC5
5o2ubXlzaXRlL3NldHRpbmdzLnB55paH5Lu25Lit55qE5pWw5o2u5bqT6K6+572u5Yib5bu65Lu7
5L2V5b+F6KaB55qE5pWw5o2u5bqT6KGo77yM5pWw5o2u5bqT55qE6L+B56e76L+Y5Lya6Lef6Liq
5bqU55So55qE5Y+Y5YyW44CC5L2g5Lya55yL5Yiw5a+55q+P5qyh6L+B56e75pyJ5LiA5p2h5L+h
5oGv44CC5aaC5p6c5L2g5pyJ5YW06Laj77yM5Y+v5Lul6L+Q6KGM5L2g55qE5pWw5o2u5bqT55qE
5ZG95Luk6KGM5a6i5oi356uv5bm26L6T5YWlZHQgKFBvc3RncmVTUUwpLCBTSE9XIFRBQkxFUzsg
KE15U1FMKeaIli5zY2hlbWEgKFNRTGl0ZSnmnaXmmL7npLpEamFuZ2/liJvlu7rnmoTooajjgII8
L3A+PHA+Jmd0O+WvueS6juaegeeugOS4u+S5ieiAheadpeivtDpJTlNUQUxMRURfQVBQU+WMheWQ
q+eahOm7mOiupOW6lOeUqOeUqOS6juW4uOingeeahOWcuuaZr++8jOS9huW5tuS4jeaYr+avj+S4
quS6uumDvemcgOimgeWug+S7rOOAgiDlpoLmnpzkvaDkuI3pnIDopoHlroPku6zkuK3nmoTku7vk
vZXkuIDkuKrmiJbmiYDmnInlupTnlKjvvIzlj6/ku6XlnKjov5DooYxtaWdyYXRl5LmL5YmN5LuO
SU5TVEFMTEVEX0FQUFPkuK3oh6rnlLHlnLDms6jph4rmiJbliKDpmaTnm7jlupTnmoTooYzjgIJt
aWdyYXRlIOWRveS7pOWwhuWPquS4uklOU1RBTExFRF9BUFBT5Lit55qE5bqU55So6L+Q6KGM5pWw
5o2u5bqT55qE6L+B56e744CCPC9wPjxwPiMjIOWIm+W7uuaooeWeizwvcD48cD7njrDlnKjlrprk
uYnor6XlupTnlKjnmoTmqKHlnovigJTigJTmnKzotKjkuIrvvIzlsLHmmK/lrprkuYnor6XmqKHl
novmiYDlr7nlupTnmoTmlbDmja7lupPorr7orqHlj4rlhbbpmYTluKbnmoTlhYPmlbDmja7jgII8
L3A+PHA+5Zyo6L+Z5Liq5oqV56Wo5bqU55So5Lit77yM5oiR5Lus5bCG5Yib5bu65Lik5Liq5qih
5Z6L77yaIFF1ZXN0aW9u5ZKMQ2hvaWNl44CCUXVlc3Rpb27lr7nosaHlhbfmnInkuIDkuKpxdWVz
dGlvbl90ZXh077yI6Zeu6aKY77yJ5bGe5oCn5ZKM5LiA5LiqcHVibGlzaF9kYXRl77yI5Y+R5biD
5pe26Ze077yJ5bGe5oCn44CCIENob2ljZeacieS4pOS4quWtl+aute+8mumAieaLqeeahOWGheWu
ueWSjOmAieaLqeeahOW+l+elqOe7n+iuoeOAgiDmr4/kuKpDaG9pY2XkuI7kuIDkuKpRdWVzdGlv
buWFs+iBlOOAgjwvcD48cD7ov5nkupvmpoLlv7XpgJrov4fnroDljZXnmoRQeXRob27nsbvmnaXo
oajnpLrjgIIg57yW6L6RcG9sbHMvbW9kZWxzLnB55paH5Lu277yM5bm26K6p5a6D55yL6LW35p2l
5YOP6L+Z5qC377yaPGJyPmBgYDxicj4jIHBvbGxzL21vZGVscy5weTxicj5mcm9tIGRqYW5nby5k
YiBpbXBvcnQgbW9kZWxzPC9wPjxwPjxicj5jbGFzcyBRdWVzdGlvbihtb2RlbHMuTW9kZWwpOjxi
cj4gICAgcXVlc3Rpb25fdGV4dCA9IG1vZGVscy5DaGFyRmllbGQobWF4X2xlbmd0aD0yMDApPGJy
PiAgICBwdWJfZGF0ZSA9IG1vZGVscy5EYXRlVGltZUZpZWxkKCdkYXRlIHB1Ymxpc2hlZCcpPC9w
PjxwPjxicj5jbGFzcyBDaG9pY2UobW9kZWxzLk1vZGVsKTo8YnI+ICAgIHF1ZXN0aW9uID0gbW9k
ZWxzLkZvcmVpZ25LZXkoUXVlc3Rpb24sIG9uX2RlbGV0ZT1tb2RlbHMuQ0FTQ0FERSk8YnI+ICAg
IGNob2ljZV90ZXh0ID0gbW9kZWxzLkNoYXJGaWVsZChtYXhfbGVuZ3RoPTIwMCk8YnI+ICAgIHZv
dGVzID0gbW9kZWxzLkludGVnZXJGaWVsZChkZWZhdWx0PTApPGJyPmBgYDxicj7ku6PnoIHlvojn
roDljZXjgILmr4/kuKrmqKHlnovnlLHkuIDkuKrlrZDnsbtkamFuZ28uZGIubW9kZWxzLk1vZGVs
55qE57G76KGo56S644CC5q+P5Liq5qih5Z6L6YO95pyJ5LiA5Lqb57G75Y+Y6YeP77yM5q+P5Liq
5Y+Y6YeP6KGo56S65qih5Z6L5Lit55qE5pWw5o2u5bqT5a2X5q6144CCPC9wPjxwPuavj+S4quWt
l+auteeUsUZpZWxk57G755qE5a6e5L6L6KGo56S677yM5L6L5aaC77yM5a2X56ym5Liy57G75Z6L
5a2X5q6155qEQ2hhckZpZWxk5ZKM5pWw5o2u5pe26Ze057G75Z6L55qERGF0ZVRpbWVGaWVsZOOA
gui/meWRiuiviURqYW5nb+avj+S4quWtl+auteaMgeacieS7gOS5iOexu+Wei+eahOaVsOaNruOA
gjwvcD48cD7mr4/kuKrlrZfmrrXlrp7kvovnmoTlkI3np7DvvIjkvovlpoJxdWVzdGlvbl90ZXh0
5oiWcHViX2RhdGXvvInlsLHmmK/lrZfmrrXnmoTlkI3np7DvvIzku6XmnLrlmajlj4vlpb3nmoTl
vaLlvI/jgILmgqjlsIblnKhQeXRob27ku6PnoIHkuK3kvb/nlKjmraTlgLzvvIzmgqjnmoTmlbDm
ja7lupPlsIbkvb/nlKjlroPkvZzkuLrliJflkI3np7DjgII8L3A+PHA+5oKo5Y+v5Lul5L2/55So
5a2X5q6155qE5Y+v6YCJ56ys5LiA5Liq5L2N572u5Y+C5pWw5p2l5oyH5a6a5LiA5Liq5pu06YCa
5L+X55qE5ZCN56ew44CC6L+Z5ZyoRGphbmdv55qE5LiA5Lqb5YaF55yB6YOo5YiG5Lit5L2/55So
77yM5a6D5Lmf5Y+v5Lul5L2c5Li65paH5qGj44CC5aaC5p6c5LiN5o+Q5L6b5q2k5a2X5q6177yM
RGphbmdv5bCG5L2/55So5py65Zmo5Y+v6K+755qE5ZCN56ew44CC5Zyo6L+Z5Liq5L6L5a2Q5Lit
77yM5oiR5Lus5Y+q5Li6UXVlc3Rpb24ucHViX2RhdGXlrprkuYnkuobkuIDkuKrpgJrkv5fnmoTl
kI3np7DjgILlr7nkuo7mraTmqKHlnovkuK3nmoTmiYDmnInlhbbku5blrZfmrrXvvIzor6XlrZfm
rrXnmoTmnLrlmajlj6/or7vlkI3np7DlsIbotrPku6XkvZzkuLrlhbbpgJrkv5flkI3np7DjgII8
L3A+PHA+5pyJ5LqbRmllbGTnsbvlhbfmnInlv4XpnIDnmoTlj4LmlbDjgILkvovlpoLvvIxDaGFy
RmllbGTopoHmsYLkvaDnu5nlroPkuIDkuKptYXhfbGVuZ3Ro44CC6L+Z5LiN5LuF5Zyo5pWw5o2u
5bqT5qih5byP5Lit5L2/55So77yM6ICM5LiU5Zyo6aqM6K+B5Lit5L2/55So44CCPC9wPjxwPkZp
ZWxk6L+Y5Y+v5Lul5pyJ5ZCE56eN5Y+v6YCJ5Y+C5pWwO+WcqOS4iuS+i+S4re+8jOaIkeS7rOWw
hnZvdGVz55qE6buY6K6k5YC86K6+572u5Li6MOOAgjwvcD48cD7mnIDlkI7vvIzkvb/nlKhGb3Jl
aWduS2V55a6a5LmJ5YWz57O744CC6L+Z5ZGK6K+JRGphbmdv5q+P5Liq6YCJ5oup5piv5LiO5Y2V
5Liq6Zeu6aKY55u45YWz44CCIERqYW5nb+aUr+aMgeaJgOacieW4uOingeeahOaVsOaNruW6k+WF
s+ezu++8muWkmuWvueS4gO+8jOWkmuWvueWkmuWSjOS4gOWvueS4gOOAgjwvcD48cD4jIyDmv4Dm
tLvmqKHlnos8L3A+PHA+5LiK6Z2i6YKj5q61566A55+t55qE5qih5Z6L5Luj56CB57uZ5LqGRGph
bmdv5b6I5aSa5L+h5oGv44CCIOacieS6hui/meS6m+S7o+egge+8jERqYW5nb+WwseiDveWkn++8
mjwvcD48cD4qIOS4uuivpeW6lOeUqOWIm+W7uuaVsOaNruW6k+ihqO+8iENSRUFURSBUQUJMRSDo
r63lj6XvvInvvJs8L3A+PHA+KiDkuLpRdWVzdGlvbuWvueixoeWSjENob2ljZeWvueixoeWIm+W7
uuS4gOS4quiuv+mXruaVsOaNruW6k+eahHB5dGhvbiBBUEnjgII8L3A+PHA+5L2G5piv6aaW5YWI
5b6X5ZyoSU5TVEFMTEVEX0FQUFPkuK3mt7vliqDmraTlupTnlKjjgII8L3A+PHA+Jmd0OyDnkIbl
v7U6IERqYW5nb+W6lOeUqOeoi+W6j+aYr+KAnOWNs+aPkuW8j+KAneeahO+8muaCqOWPr+S7peWc
qOWkmuS4qumhueebruS4reS9v+eUqOW6lOeUqOeoi+W6j++8jOW5tuS4lOaCqOWPr+S7peWIhuWP
keW6lOeUqOeoi+W6j++8jOWboOS4uuS7luS7rOS4jeW/hee7keWumuWIsOe7meWumueahERqYW5n
b+WuieijheOAgjwvcD48cD7opoHlnKjmiJHku6znmoTpobnnm67kuK3ljIXlkKvlupTnlKjnqIvl
uo/vvIzmiJHku6zpnIDopoHlnKhJTlNUQUxMRURfQVBQU+iuvue9ruS4rea3u+WKoOWvueWFtumF
jee9ruexu+eahOW8leeUqOOAgiBQb2xsQ29uZmln57G75L2N5LqOcG9sbHMvYXBzLnB55paH5Lu2
5Lit77yM5Zug5q2k5YW26Jma57q/6Lev5b6E5Li64oCccG9sbHMuYXBwcy5Qb2xsc0NvbmZpZ+KA
neOAgue8lui+kW15c2l0ZS9zZXR0aW5ncy5weeaWh+S7tu+8jOW5tuWwhuivpeiZmue6v+i3r+W+
hOa3u+WKoOWIsElOU1RBTExFRF9BUFBT6K6+572u44CC5a6D55yL6LW35p2l5YOP6L+Z5qC3Ojwv
cD48cD5gYGA8YnI+IyAgbXlzaXRlL3NldHRpbmdzLnB5PGJyPklOU1RBTExFRF9BUFBTID0gWzxi
cj4gICAgJ2RqYW5nby5jb250cmliLmFkbWluJyw8YnI+ICAgICdkamFuZ28uY29udHJpYi5hdXRo
Jyw8YnI+ICAgICdkamFuZ28uY29udHJpYi5jb250ZW50dHlwZXMnLDxicj4gICAgJ2RqYW5nby5j
b250cmliLnNlc3Npb25zJyw8YnI+ICAgICdkamFuZ28uY29udHJpYi5tZXNzYWdlcycsPGJyPiAg
ICAnZGphbmdvLmNvbnRyaWIuc3RhdGljZmlsZXMnLDxicj4gICAgJ3BvbGxzLmFwcHMuUG9sbHND
b25maWcnPGJyPl08YnI+YGBgPGJyPueOsOWcqERqYW5nb+WMheWQq+S6hnBvbGxz5bqU55So77yM
5LiL6Z2i6L+Q6KGMOjwvcD48cD5gYGA8YnI+cHl0aG9uIG1hbmFnZS5weSBtYWtlbWlncmF0aW9u
cyBwb2xsczxicj5gYGA8L3A+PHA+5bCG5Lya55yL5Yiw5aaC5LiL6L6T5Ye6Ojxicj5gYGA8YnI+
TWlncmF0aW9ucyBmb3IgJ3BvbGxzJzo8YnI+ICBwb2xsc1xtaWdyYXRpb25zXDAwMDFfaW5pdGlh
bC5weTo8YnI+ICAgIC0gQ3JlYXRlIG1vZGVsIENob2ljZTxicj4gICAgLSBDcmVhdGUgbW9kZWwg
UXVlc3Rpb248YnI+ICAgIC0gQWRkIGZpZWxkIHF1ZXN0aW9uIHRvIGNob2ljZTwvcD48cD5gYGA8
YnI+6YCa6L+H6L+Q6KGMbWFrZW1pZ3JhdGlvbnPlkYror4lEamFuZ2/vvIzlt7Lnu4/lr7nmqKHl
novlgZrkuobkuIDkupvmm7TmlLnvvIjlnKjov5nkuKrkvovlrZDkuK3vvIzkvaDliJvlu7rkuobk
uIDkuKrmlrDnmoTmqKHlnovvvInlubbkuJTkvJrlsIbov5nkupvmm7TmlLnlrZjlgqjkuLrov4Hn
p7vmlofku7bjgII8L3A+PHA+6L+B56e75pivRGphbmdv5YKo5a2Y5qih5Z6L55qE5Y+Y5YyW77yI
5Lul5Y+K5oKo55qE5pWw5o2u5bqT5qih5byP77yJ77yM5a6D5Lus5Y+q5piv56OB55uY5LiK55qE
5paH5Lu244CC5aaC5p6c5oS/5oSP77yM5L2g5Y+v5Lul6ZiF6K+76L+Z5Lqb5Li65paw5qih5Z6L
5bu656uL55qE6L+B56e75paH5Lu277yb6L+Z5Liq6L+B56e75paH5Lu25bCx5pivcG9sbHMvbWln
cmF0aW9ucy8wMDAxX2luaXRpYWwucHnjgILkuI3nlKjmi4Xlv4PvvIxEamFuZ2/kuI3opoHmsYLk
vaDlnKjmr4/mrKFEamFuZ2/nlJ/miJDov4Hnp7vmlofku7bkuYvlkI7pg73opoHpmIXor7vov5nk
upvmlofku7bvvIzkvYbmmK/lroPku6zooqvorr7orqHmiJDlj6/kurrkuLrnvJbovpHnmoTlvaLl
vI/vvIzku6Xkvr/kvaDlj6/ku6XmiYvlt6XnqI3lvq7kv67mlLnkuIDkuItEamFuZ2/nmoTmn5Dk
upvlhbfkvZPooYzkuLrjgII8L3A+PHA+5pyJ5LiA5Liq5ZG95Luk5Y+v5Lul6L+Q6KGM6L+Z5Lqb
6L+B56e75paH5Lu25bm26Ieq5Yqo566h55CG5L2g55qE5pWw5o2u5bqT5qih5byP4oCU4oCUbWln
cmF0Ze+8jOaIkeS7rOS4gOS8muWEv+S8mueUqOWIsOWug+OAguS9huaYr+mmluWFiO+8jOiuqeaI
keS7rOeci+S4gOS4i+i/geenu+ihjOS4uuWwhuS8muaJp+ihjOWTquS6m1NRTOivreWPpeOAgnNx
bG1pZ3JhdGXlkb3ku6TmjqXmlLbov4Hnp7vmlofku7bnmoTlkI3lrZflubbov5Tlm57lroPku6zn
moRTUUzor63lj6XvvJo8L3A+PHA+YGBgPGJyPnB5dGhvbiBtYW5hZ2UucHkgc3FsbWlncmF0ZSBw
b2xscyAwMDAxPGJyPmBgYDwvcD48cD7kvaDlupTor6XkvJrnnIvliLDnsbvkvLzlpoLkuIvnmoTl
hoXlrrnvvIjkuLrkuobkvr/kuo7pmIXor7vmiJHku6zlr7nlroPph43mlrDnvJbmjpLkuobmoLzl
vI/vvInvvJo8YnI+YGBgPGJyPkJFR0lOOzxicj5DUkVBVEUgVEFCTEUgInBvbGxzX2Nob2ljZSIg
KDxicj4gICAgImlkIiBzZXJpYWwgTk9UIE5VTEwgUFJJTUFSWSBLRVksPGJyPiAgICAiY2hvaWNl
X3RleHQiIHZhcmNoYXIoMjAwKSBOT1QgTlVMTCw8YnI+ICAgICJ2b3RlcyIgaW50ZWdlciBOT1Qg
TlVMTDxicj4pOzxicj5DUkVBVEUgVEFCTEUgInBvbGxzX3F1ZXN0aW9uIiAoPGJyPiAgICAiaWQi
IHNlcmlhbCBOT1QgTlVMTCBQUklNQVJZIEtFWSw8YnI+ICAgICJxdWVzdGlvbl90ZXh0IiB2YXJj
aGFyKDIwMCkgTk9UIE5VTEwsPGJyPiAgICAicHViX2RhdGUiIHRpbWVzdGFtcCB3aXRoIHRpbWUg
em9uZSBOT1QgTlVMTDxicj4pOzxicj5BTFRFUiBUQUJMRSAicG9sbHNfY2hvaWNlIiBBREQgQ09M
VU1OICJxdWVzdGlvbl9pZCIgaW50ZWdlciBOT1QgTlVMTDs8YnI+QUxURVIgVEFCTEUgInBvbGxz
X2Nob2ljZSIgQUxURVIgQ09MVU1OICJxdWVzdGlvbl9pZCIgRFJPUCBERUZBVUxUOzxicj5DUkVB
VEUgSU5ERVggInBvbGxzX2Nob2ljZV83YWEwZjZlZSIgT04gInBvbGxzX2Nob2ljZSIgKCJxdWVz
dGlvbl9pZCIpOzxicj5BTFRFUiBUQUJMRSAicG9sbHNfY2hvaWNlIjxicj4gIEFERCBDT05TVFJB
SU5UICJwb2xsc19jaG9pY2VfcXVlc3Rpb25faWRfMjQ2Yzk5YTY0MGZiYmQ3Ml9ma19wb2xsc19x
dWVzdGlvbl9pZCI8YnI+ICAgIEZPUkVJR04gS0VZICgicXVlc3Rpb25faWQiKTxicj4gICAgUkVG
RVJFTkNFUyAicG9sbHNfcXVlc3Rpb24iICgiaWQiKTxicj4gICAgREVGRVJSQUJMRSBJTklUSUFM
TFkgREVGRVJSRUQ7PC9wPjxwPkNPTU1JVDs8YnI+YGBgPC9wPjxwPuazqOaEj+S7peS4i+WHoOeC
uTo8L3A+PHA+KiDovpPlh7rnmoTlhbfkvZPlhoXlrrnkvJrkvp3mja7kvaDkvb/nlKjnmoTmlbDm
ja7lupPogIzkuI3lkIzjgIIg5Lul5LiK5L6L5a2Q5L2/55So55qE5pWw5o2u5bqT5pivUG9zdGdy
ZVNRTDs8L3A+PHA+KiDooajlkI3mmK/oh6rliqjnlJ/miJDnmoTvvIznlLFhcHDnmoTlkI3lrZfv
vIhwb2xsc++8ieWSjOaooeWei+WQjeWtl+eahOWwj+WGmeWtl+avjee7hOWQiOiAjOaIkCDigJTi
gJQgcXVlc3Rpb27lkoxjaG9pY2Uo5L2g5Y+v5Lul6YeN5YaZ6L+Z5Liq6KGM5Li6KTs8L3A+PHA+
KiDkuLvplK7vvIhJRHPvvInmmK/oh6rliqjmt7vliqDnmoTjgIIg77yI5L2g5Lmf5Y+v5Lul6YeN
5YaZ6L+Z5Liq6KGM5Li6KTs8L3A+PHA+KiDmjInnhafmg6/kvovvvIxEamFuZ2/kvJrlnKjlpJbp
lK7nmoTlrZfmrrXlkI3lkI7pnaLmt7vliqAgIl9pZCLjgILvvIjkvaDkvp3nhLblj6/ku6Xph43l
hpnov5nkuKrooYzkuLrvvIk7PC9wPjxwPiog5aSW6ZSu5YWz57O755SxRk9SRUlHTiBLRVnnuqbm
nZ/mmL7lvI/lo7DmmI7jgILkuI3nlKjlnKjmhI9ERUZFUlJBQkxF6YOo5YiG77yb5a6D5Y+q5piv
5ZGK6K+JUG9zdGdyZVNRTOebtOWIsOS6i+WKoeeahOacgOWQjuWGjeaJp+ihjOWklumUruWFs+iB
lDs8L3A+PHA+KiDov5nkuptTUUzor63lj6XmmK/pkojlr7nkvaDmiYDkvb/nlKjnmoTmlbDmja7l
upPlrprliLbnmoTvvIzmiYDku6XkvJrkuLrkvaDoh6rliqjlpITnkIbmn5DkupvmlbDmja7lupPm
iYDnibnmnInnmoTlrZfmrrXkvovlpoJhdXRvX2luY3JlbWVudCAoTXlTUUwp44CBIHNlcmlhbCAo
UG9zdGdyZVNRTCnmiJZpbnRlZ2VyIHByaW1hcnkga2V5IGF1dG9pbmNyZW1lbnQgKFNRTGl0ZSkg
44CC5Zyo5aSE55CG5a2X5q615ZCN55qE5byV5Y+35pe25Lmf5piv5aaC5q2kIOKAlOKAlCDkvovl
poLvvIzkvb/nlKjlj4zlvJXlj7fov5jmmK/ljZXlvJXlj7c7PC9wPjxwPiogc3FsbWlncmF0ZeWR
veS7pOW5tuS4jeS8muWcqOS9oOeahOaVsOaNruW6k+S4iuecn+ato+i/kOihjOi/geenu+aWh+S7
tiDigJTigJQg5a6D5Y+q5piv5oqKRGphbmdvIOiupOS4uumcgOimgeeahFNRTOaJk+WNsOWcqOWx
j+W5leS4iuS7peiuqeS9oOiDveWkn+eci+WIsOOAgiDov5nlr7nkuo7mo4Dmn6VEamFuZ2/lsIbo
poHov5vooYznmoTmlbDmja7lupPmk43kvZzmiJbogIXkvaDnmoTmlbDmja7lupPnrqHnkIblkZjp
nIDopoHov5nkuptTUUzohJrmnKzmmK/pnZ7luLjmnInnlKjnmoTjgII8L3A+PHA+5aaC5p6c5L2g
5pyJ5YW06Laj77yM5L2g5Lmf5Y+v5Lul6L+Q6KGMYHB5dGhvbiBtYW5hZ2UucHkgY2hlY2tgO+i/
meWwhuajgOafpeaCqOeahOmhueebruS4reeahOS7u+S9lemXrumimO+8jOiAjOS4jei/m+ihjOi/
geenu+aIluinpuaRuOaVsOaNruW6k+OAgjwvcD48cD7njrDlnKjvvIzlho3mrKHov5DooYxtaWdy
YXRl5Lul5Zyo5L2g55qE5pWw5o2u5bqT5Lit5Yib5bu65qih5Z6L5omA5a+55bqU55qE6KGoOjwv
cD48cD5gYGA8YnI+JCBweXRob24gbWFuYWdlLnB5IG1pZ3JhdGU8YnI+T3BlcmF0aW9ucyB0byBw
ZXJmb3JtOjxicj4gIEFwcGx5IGFsbCBtaWdyYXRpb25zOiBhZG1pbiwgYXV0aCwgY29udGVudHR5
cGVzLCBwb2xscywgc2Vzc2lvbnM8YnI+UnVubmluZyBtaWdyYXRpb25zOjxicj4gIFJlbmRlcmlu
ZyBtb2RlbCBzdGF0ZXMuLi4gRE9ORTxicj4gIEFwcGx5aW5nIHBvbGxzLjAwMDFfaW5pdGlhbC4u
LiBPSzxicj5gYGA8L3A+PHA+bWlncmF0ZeWRveS7pOS8muaJvuWHuuaJgOaciei/mOayoeacieii
q+W6lOeUqOeahOi/geenu+aWh+S7tu+8iERqYW5nb+S9v+eUqOaVsOaNruW6k+S4reS4gOS4quWP
q+WBmmRqYW5nb19taWdyYXRpb25z55qE54m55q6K6KGo5p2l6L+96Liq5ZOq5Lqb6L+B56e75paH
5Lu25bey57uP6KKr5bqU55So6L+H77yJ77yM5bm25LiU5Zyo5L2g55qE5pWw5o2u5bqT5LiK6L+Q
6KGM5a6D5Lus44CC5bCx5piv5L2/5L2g55qE5pWw5o2u5bqT5qih5byP5ZKM5L2g5pS55Yqo5ZCO
55qE5qih5Z6L6L+b6KGM5ZCM5q2l44CCPC9wPjxwPui/geenu+WKn+iDvemdnuW4uOW8uuWkp++8
jOWPr+S7peiuqeS9oOWcqOW8gOWPkei/h+eoi+S4reS4jeaWreS/ruaUueS9oOeahOaooeWei+iA
jOS4jeeUqOWIoOmZpOaVsOaNruW6k+aIluiAheihqOeEtuWQjuWGjemHjeaWsOeUn+aIkOS4gOS4
quaWsOeahCDigJTigJQg5a6D5LiT5rOo5LqO5Y2H57qn5L2g55qE5pWw5o2u5bqT5LiU5LiN5Lii
5aSx5pWw5o2u44CCIOaIkeS7rOWwhuWcqOacrOaVmeeoi+eahOWQjue7reeroOiKguWvuei/geen
u+i/m+ihjOa3seWFpeWcsOiusuino++8jOS9huaYr+eOsOWcqO+8jOivt+iusOS9j+WunueOsOao
oeWei+WPmOabtOeahOS4ieS4quatpemqpO+8mjwvcD48cD4qIOS/ruaUueS9oOeahOaooeWei++8
iOWcqG1vZGVscy5weeaWh+S7tuS4re+8ie+8mzwvcD48cD4qIOi/kOihjGBweXRob24gbWFuYWdl
LnB5IG1ha2VtaWdyYXRpb25zYO+8jOS4uui/meS6m+S/ruaUueWIm+W7uui/geenu+aWh+S7tu+8
mzwvcD48cD4qIOi/kOihjGBweXRob24gbWFuYWdlLnB5IG1pZ3JhdGVg77yM5bCG6L+Z5Lqb5pS5
5Y+Y5pu05paw5Yiw5pWw5o2u5bqT5LitOzwvcD48cD7pmIXor7tbZGphbmdvLWFkbWluXShodHRw
Oi8vcHl0aG9uLnVzeWl5aS5jbi9kb2N1bWVudHMvZGphbmdvXzE4Mi9yZWYvZGphbmdvLWFkbWlu
Lmh0bWwpIOeahOaWh+aho+adpeS6huino21hbmFnZS5weSDlt6Xlhbfog73lgZrnmoTmiYDmnInk
uovmg4XjgII8L3A+PHA+IyMg5L2/55SoQVBJPC9wPjxwPueOsOWcqO+8jOi/m+WFpVB5dGhvbuea
hOS6pOS6kuW8j3NoZWxs77yM546p6L2s6L+Z5LqbRGphbmdv5o+Q5L6b57uZ5L2g55qEQVBJ44CC
IOS9v+eUqOWmguS4i+WRveS7pOadpeiwg+eUqFB5dGhvbiBzaGVsbO+8mjwvcD48cD5gYGA8YnI+
cHl0aG9uIG1hbmFnZS5weSBzaGVsbDxicj5gYGA8L3A+PHA+5oiR5Lus5L2/55So5LiK6L+w5ZG9
5Luk6ICM5LiN5piv566A5Y2V5Zyw6ZSu5YWl4oCccHl0aG9u4oCd6L+b5YWlcHl0aG9u546v5aKD
77yM5piv5Zug5Li6bWFuYWdlLnB5IOiuvue9ruS6hmBESkFOR09fU0VUVElOR1NfTU9EVUxFYOeO
r+Wig+WPmOmHj++8jOivpeeOr+Wig+WPmOmHj+WRiuiviURqYW5nb+WvvOWFpW15c2l0ZS9zZXR0
aW5ncy5weeaWh+S7tueahOi3r+W+hOOAgjwvcD48cD4mZ3Q7IOe7lei/h21hbmFnZS5weTog5p6c
5L2g5LiN5oOz5L2/55SobWFuYWdlLnB577yM5Y+q6KaB6K6+572uREpBTkdPX1NFVFRJTkdTX01P
RFVMRSDnjq/looPlj5jph4/kuLogbXlzaXRlLnNldHRpbmdz77yM5ZCv5Yqo5LiA5Liq5pmu6YCa
55qEUHl0aG9uIHNoZWxs77yM54S25ZCO5bu656uLRGphbmdv77yaPGJyPmBgYDxicj4mZ3Q7Jmd0
OyZndDsgaW1wb3J0IGRqYW5nbzxicj4mZ3Q7Jmd0OyZndDsgZGphbmdvLnNldHVwKCk8YnI+YGBg
PGJyPuWmguaenOS7peS4iuWRveS7pOW8leWPkeS6huS4gOS4qkF0dHJpYnV0ZUVycm9y77yM5Y+v
6IO95piv5L2g5L2/55So5LqG5LiA5Liq5ZKM5pys5pWZ56iL5LiN5Yy56YWN55qERGphbmdv54mI
5pys44CCIOS9oOWPr+iDvemcgOimgeaNouS4gOS4quiAgeS4gOeCueeahOaVmeeoi+aIluiAheaN
ouS4gOS4quaWsOS4gOeCueeahERqYW5nb+eJiOacrOOAgjxicj7mgqjlv4Xpobvku45tYW5hZ2Uu
cHnmiYDlnKjnmoTlkIzkuIDnm67lvZXov5DooYxweXRob27vvIzmiJbnoa7kv53or6Xnm67lvZXl
nKhQeXRob27mkJzntKLot6/lvoTkuK3vvIzov5nkuKppbXBvcnQgbXlzaXRl5omN5Lya5oiQ5Yqf
44CCPC9wPjxwPuW9k+S9oOi/m+WFpXNoZWxs5ZCO77yM5bCd6K+V5LiA5LiL5LiL6Z2i55qEQVBJ
5ZCn77yaPGJyPmBgYDxicj4mZ3Q7Jmd0OyZndDsgZnJvbSBwb2xscy5tb2RlbHMgaW1wb3J0IFF1
ZXN0aW9uLCBDaG9pY2UgICAjIOWvvOWFpeaIkeS7rOWGmeeahOaooeWei+exuzwvcD48cD4jIHF1
ZXN0aW9u5Li656m6PGJyPiZndDsmZ3Q7Jmd0OyBRdWVzdGlvbi5vYmplY3RzLmFsbCgpPGJyPiZs
dDtRdWVyeVNldCBbXSZndDs8L3A+PHA+IyDmlrDlu7rkuIDkuKpRdWVzdGlvbjxicj4jIOWcqOm7
mOiupOiuvue9ruaWh+S7tuS4reWQr+eUqOWvueaXtuWMuueahOaUr+aMgSwgRGphbmdv5o6o6I2Q
5L2/55SodGltZXpvbmUubm93KCnku6Pmm79weXRob27lhoXnva7nmoRkYXRldGltZS5kYXRldGlt
ZS5ub3coKTxicj4mZ3Q7Jmd0OyZndDsgZnJvbSBkamFuZ28udXRpbHMgaW1wb3J0IHRpbWV6b25l
PGJyPiZndDsmZ3Q7Jmd0OyBxID0gUXVlc3Rpb24ocXVlc3Rpb25fdGV4dD0iV2hhdCdzIG5ldz8i
LCBwdWJfZGF0ZT10aW1lem9uZS5ub3coKSk8L3A+PHA+IyDosIPnlKhzYXZlKCnmlrnms5XvvIzl
sIblhoXlrrnkv53lrZjliLDmlbDmja7lupPkuK08YnI+Jmd0OyZndDsmZ3Q7IHEuc2F2ZSgpPC9w
PjxwPiMg6buY6K6k5oOF5Ya177yM5L2g5Lya6Ieq5Yqo6I635b6X5LiA5Liq6Ieq5aKe55qE5ZCN
5Li6aWTnmoTkuLvplK48YnI+Jmd0OyZndDsmZ3Q7IHEuaWQ8YnI+MTwvcD48cD4jIOmAmui/h3B5
dGhvbueahOWxnuaAp+iwg+eUqOaWueW8j++8jOiuv+mXruaooeWei+Wtl+auteeahOWAvDxicj4m
Z3Q7Jmd0OyZndDsgcS5xdWVzdGlvbl90ZXh0PGJyPiJXaGF0J3MgbmV3PyI8YnI+Jmd0OyZndDsm
Z3Q7IHEucHViX2RhdGU8YnI+ZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMiwgMiwgMjYsIDEzLCAwLCAw
LCA3NzUyMTcsIHR6aW5mbz0mbHQ7VVRDJmd0Oyk8L3A+PHA+IyDpgJrov4fkv67mlLnlsZ7mgKfm
naXkv67mlLnlrZfmrrXnmoTlgLzvvIznhLblkI7osIPnlKhzYXZl5pa55rOV6L+b6KGM5L+d5a2Y
44CCPGJyPiZndDsmZ3Q7Jmd0OyBxLnF1ZXN0aW9uX3RleHQgPSAiV2hhdCdzIHVwPyI8YnI+Jmd0
OyZndDsmZ3Q7IHEuc2F2ZSgpPC9wPjxwPiMgb2JqZWN0cy5hbGwoKSDnlKjkuo7mn6Xor6LmlbDm
ja7lupPlhoXnmoTmiYDmnIlxdWVzdGlvbnM8YnI+Jmd0OyZndDsmZ3Q7IFF1ZXN0aW9uLm9iamVj
dHMuYWxsKCk8YnI+Jmx0O1F1ZXJ5U2V0IFsmbHQ7UXVlc3Rpb246IFF1ZXN0aW9uIG9iamVjdCZn
dDtdJmd0Ozxicj5gYGA8L3A+PHA+YCZsdDtRdWVzdGlvbjogUXVlc3Rpb24gb2JqZWN0Jmd0O2Dl
r7nkuo7ov5nkuKrlr7nosaHmmK/kuIDkuKrkuI3lj6/or7vnmoTlhoXlrrnlsZXnpLrvvIzkvaDm
l6Dms5Xku47kuK3ojrflvpfku7vkvZXnm7Top4LnmoTkv6Hmga/jgIIg6K6p5oiR5Lus5p2l5L+u
5aSN6L+Z5Liq6Zeu6aKY77yM6K6pRGphbmdv5Zyo5omT5Y2w5a+56LGh5pe25pi+56S65LiA5Lqb
5oiR5Lus5oyH5a6a55q
以上是关于Django 1.10中文文档-第一个应用Part2-模型和管理站点的主要内容,如果未能解决你的问题,请参考以下文章
Django 1.10文档中文版Part1
Django 1.10文档中文版Part2
Django 1.10文档中文版Part4
django入门-part3
第一个Django应用程序_part3
[python][django 1.10中文文档]