编辑你的django

编写你的Django应用,第1部分:

让我们通过例子学习:

本教程中,我们将带领你创建一个基本的投票应用:

它包含两部分:

1.一个公开的网站,可以让访客查看投票的结果并让他们进行投票

2.一个后台管理网站,你可以添加,修改和删除投票。


如果你已经安装了Django。 你可以运行下面的命令来查看你的Django版本号

$ python -c "import django; print(django.get_version())"

node2:/django/mysite/news# python -c "import django; print(django.get_version())"
1.11


创建一个项目:


如果这是你第一次使用Django,你需要完成一些初始化设置,你需要自己用代码来创建一个Django项目---

一个Django框架开发的网站,创建项目后我们需要的配置的东西,包括数据库的配置,针对Django的配置选项和app的配置选项。


node2:/django1.8# django-admin startproject mysite
node2:/django1.8#ls
mysite

这将会在你的当前目录下生成一个mysite目录,如果它不能正常工作


注意


你给项目命名时,项目名称不能和Python和Django的内部组件名称同名。尤其,你应该避免使用类似django(与Django自身冲突)


或test(与Python内建的包冲突)这样的名称。

node2:/django1.8#ls
mysite
node2:/django1.8#tree
.
└── mysite
    ├── manage.py
    └── mysite
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py

2 directories, 5 files
node2:/django1.8#


这些文件是:

1.外层的mysite/根目录仅仅是项目的一个容器,它的命名对Django无关紧要,你可以把它重命名为任何你喜欢的名字。


2.manage.py :一个命令行工具,可以使你用多种方式对Django项目进行交互.




3.内层的mysite/目录是你的项目的真正的Python包,它是你导入任何东西时需要使用的Python包的名字(例如mysite.urls)


4.mysite/__init__.py:一个空文件,它告诉Python这个目录应该被看做一个Python包



数据库的建立:

现在,编辑mysite/settigs.py,它是一个用模块级别变量表示Django配置的普通Python模块。


如果你希望使用另外一种数据库,请配置合适的database binding,并在DATABASES  'default' 条目中修改以下的配置

以及匹配你的数据库连接设置:

1.


DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'tlcb',
'USER': 'root',
'PASSWORD': '1234567',
'HOST': '192.168.137.3',
'PORT': '3306',
}
}

另外,请注意文件顶端INSTALLED_APPS设置。它保存这个Django实例中激活的所有的Django应用的名字,应用可以在多个项目中使用,



而且你可以将这些应用打包和分发给其他人在它们的项目中使用:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

默认情况下,INSTALLED_APPS包含下面的应用,它们都是Django 与生俱来的:

django.contrib.admin —— 管理站点。你将在本教程的第2部分使用到它。
django.contrib.auth —— 认证系统。
django.contrib.contenttypes —— 用于内容类型的框架。
django.contrib.sessions —— 会话框架。
django.contrib.messages —— 消息框架。
django.contrib.staticfiles —— 管理静态文件的框架。
这些应用,默认包含在Django中,以方便通用场合下使用。

然而上面的部分应用至少需要使用一个数据库表,因此我们需要在使用它们之前先在数据库中创建相应的表。要做到这一点,请运行以下命令:

$ python manage.py migrate



node2:/django1.8/mysite# python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK
node2:/django1.8/mysite#


如果你需要改变服务器的IP地址,把IP地址和端口号放到一起,因此若要监听所有的外围IP,请使用

(如果你想在另外一台电脑上展示你的工作,会非常有用):

Invalid HTTP_HOST header: '192.168.137.3:9000'. You may need to add u'192.168.137.3' to ALLOWED_HOSTS.
[19/Nov/2017 09:39:47] "GET / HTTP/1.1" 400 61975


创建模型:

现在,你的开发环境---一个项目已经建立起来,你将开始在上面做一些东西:


你编写的每个Django应用都是遵循特定约定且包含一个Python包,Django自带一个工具,它可以自动生成应用的基本目录结构,

这样这就能专心书写代码而不是创建目录。


项目VS应用:

项目和应用之间有什么不同?应用是一个Web应用程序,它完成具体的事项---比如一个博客系统,

一个存储公共档案的数据库或者一个简单的投票应用。

项目时一个特定网站中相关配置和应用的集合。一个项目可以包含多个应用,一个应用可以运用到多个项目中去。



你的应用可以放在Python path上的任何位置,在本教程中,我们将在你的manage.py文件同级目录创建我们的投票应用,

以便可以将它作为顶层模块导入,而不是mysite的子模块。

要创建您的应用程序,请确保您与manage.py在同一目录中,并键入以下命令:

node2:/django1.8/mysite#python manage.py startapp polls
node2:/django1.8/mysite#ls
manage.py  mysite  polls
node2:/django1.8/mysite#

node2:/django1.8/mysite#tree polls/
polls/
├── admin.py
├── apps.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

1 directory, 7 files


当编写一个数据库驱动的Web应用时,第一步就是定义该应用的模型--本质上,就是定义该模型所对应的

数据库设计及其附带的元数据。


原理:

模型指出了数据的唯一,明确的真实来源,它包含了正在存储的数据的基本字段和行为。

Django 遵循DRU(Don't repeat yourself)的原则。


这个原则的目标是在一个地方定义了你的数据模型,并自动从它获得需要的信息。


迁移工具也符合以上哲学--这不同于Ruby On Rails中的迁移;例如,迁移完全按照你的模型文件且本质上只是一个历史记录,


Django 通过这个历史记录更新你的数据库模式使它与你现在的模型文件保持一致。


在这个简单的投票应用中,我们将创建两个模型: 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)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)


上述代码非常直观,每个模型都用一个类表示,该类继承自django.db.models.Model。

每个模型都有一些类变量,在模型中每个类变量都代表了数据库中的一个字段。

每个字段通过Field类的一个实例表示---例如字符串CharField和日期字段DateTimeField。

这种方法告诉Django,每个字段中保存着生命类型的数据。


每个Field 实例的名字(例如question_text或pub_date)就是字段的名字,并且是机器可读的格式。

你将在Python代码中使用到它的值,并且你的数据库将它用作表的列名。


你可以使用Field的第一个参数来指定一个人类可读的名字,这是可选的。

它在Django的内省机制中有使用,而且可以兼做文档。

如果没有提供这个参数,Django将使用那个机器可读的名字(实例名)


激活模型:

上面那段简短的模型代码给了Django很多信息。有了这些代码,Django就能够自动完成以下两个功能:


1.为该应用创建数据库表(CREATE TABLE语句)

2.位Question对象和Choice对象创建一个访问数据库的python API。


Django 应用是可以"热插拔"的,即可以在多个项目中使用同一个应用,也可以分发这些应用,因为它们不需要于某个特定的

Django安装绑定。


再次编辑mysite/settings.py文件,并修改INSTALLED_APPS 设置以包含字符串'polls',所以它现成是这样的:

mysite/settings.py
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls',
)

现在Django知道要包含polls应用。 让我们运行另外一个命令:

$ python manage.py makemigrations polls



node2:/django1.8/mysite#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 如何存储模型的变化(以及你的数据库模式),它们只是磁盘上的文件。

有一个命令可以运行这些迁移文件并自动管理你的数据库模式---它叫做migrate,我们一会用到它

但是首先,让我们看一下迁移行为将会执行哪些SQL语句。

sqlmigrate命令接收迁移文件的名字并返回它们的SQL语句:


node2:/django1.8/mysite#python manage.py sqlmigrate polls 0001
BEGIN;
--
-- Create model Choice
--
CREATE TABLE `polls_choice` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `choice_text` varchar(200) NOT NULL, `votes` integer NOT NULL);
--
-- Create model Question
--
CREATE TABLE `polls_question` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `question_text` varchar(200) NOT NULL, `pub_date` datetime(6) NOT NULL);
--
-- Add field question to choice
--
ALTER TABLE `polls_choice` ADD COLUMN `question_id` integer NOT NULL;
ALTER TABLE `polls_choice` ADD CONSTRAINT `polls_choice_question_id_c5b4b260_fk_polls_question_id` FOREIGN KEY (`question_id`) REFERENCES `polls_question` (`id`);
COMMIT;

现在,再次运行migrate以在你的数据库中创建模型所对应的表:

node2:/django1.8/mysite#python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, polls, sessions
Running migrations:
  Applying polls.0001_initial... OK
You have mail in /var/spool/mail/root
node2:/django1.8/mysite#

migrate命令会好处所有还没有被应用的迁移文件,并且在你的数据库上运行它们--

本质上来讲,就是使你的数据库模式和你改动后的模型进行同步。


运行python manage.py makemigrations ,为这些修改创建迁移文件
运行python manage.py migrate ,将这些改变更新到数据库中。

玩转API:

现在,让我们进入Python的交互式shell,婉转这些Django提供你的API,使用如下命令来调用Python shell:


python manage.py shell


我们使用上述命令而不是简单地键入"python"进入python环境,是因为manage.py 设置了

DJANGO_SETTINGS_MODULE 环境变量,该环境变量告诉Django 导入mysite/settings.py文件的路径。


如果你不想使用manage.py,也没问题。只要设置DJANGO_SETTINGS_MODULE 环境变量为 mysite.settings,启动一个普通的Python shell,然后建立Django:

>>> import django
>>> django.setup()


node2:/django1.8/mysite#export DJANGO_SETTINGS_MODULE='mysite.settings'
node2:/django1.8/mysite#python
Python 2.7.3 (default, Mar 30 2017, 20:15:12) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> django.setup()



>>> from polls.models import Question, Choice
>>> Question.objects.all()
<QuerySet [<Question: Question object>]>
>>> 

先等一下。<Question: Question object>对于这个对象是一个完全没有意义的表示。 让我们来修复这个问题,编辑Question模型(在polls/models.py文件中)并添加一个__str__()方法给Question和Choice:




<QuerySet [<Question: aaaaa>]>
>>> Question.objects.all()
<QuerySet [<Question: aaaaa>, <Question: 9999999999>]>
>>> 

# Create a new Question.
# Support for time zones is enabled in the default settings file, so
# Django expects a datetime with tzinfo for pub_date. Use timezone.now()
# instead of datetime.datetime.now() and it will do the right thing.
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())


q = Question(pub_date=timezone.now())




q = Question(question_text="tlcb999", pub_date=timezone.now())

原文地址:https://www.cnblogs.com/hzcya1995/p/13349418.html