Django tutorial part1

writing_first_django_app_part1

Creating a project

查看django版本:

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

创建工程,进入需要放置工程的目录:

$ django-admin.py startproject mysite

会创建以下文件:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py

manage.py用来与工程进行命令行交互 settings.py里面是项目的配置 urls.py是项目的一些URL声明 wsgi.py是wsgi网站服务器支持工程的入口

默认使用SQLite数据库

INSTALLED_APPS: 在settings.py中,默认有以下几个可以使用:

  • django.contrib.admin: 管理者站点
  • django.contrib.auth: authentication system
  • django.contrib.contenttypes
  • django.contrib.sessions
  • django.contrib.messages
  • django.contrib.staticfiles

因为一些应用使用了至少一个数据库表格,所以我们需要在使用之前在数据库创建这些表格,运行:

$ python manage.py migrate

这个命令查看INSTALLED_APPS中激活的应用,然后根据settings.py文件来创建需要的数据库.可以通过命令查看已经创建的表格,如SQLite中.schema可以查看 具体可以在数据库文件的目录下先通过终端打开数据库命令行交互界面:

$ sqlite3 db.sqlite3

然后在交互界面中输入.schema即可查看 ad 接下来就可以尝试运行服务器了:

$ python manage.py runserver

# python manage.py runserver 0.0.0.0:8080 可以指定ip,端口

一般情况下修改代码之后不需要重新运行server,我们发出请求时修改的代码会自动生效,除非是增加文件等操作才需要重启服务器

Creating models 创建一个app:

python manage.py startapp polls

修改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)

每个变量值都属于一个Field类,ForeignKey表示一种多对一的关系,django支持数据库常用的几种关系:多对一,多对多,一对一.

Activating models

有了上面model的代码之后可以给django提供很多信息,可以为这个app创建数据库表格,创建python的数据库接口给Question和Choice,不过首先要告诉工程polls这个app 在settings.py中的INSTALLED_APPS中添加一项‘polls‘,然后命令行:

$ python manage.py makemigrations polls

migrations是django用来记录models的改变的文件

还有一种可以查看数据库需要改变的地方:

$ python manage.py sqlmigrate polls 0001

这里并不是真正执行migrate,只是输出django认为需要的SQL语句,可以用来预先检查

还有一种检查方式:

$ python manage.py check

会告诉我们有多少个问题

现在可以真正执行migrate操作去创建model表格在数据库中:

$ python manage.py migrate

migrate这种机制对于我们开发是非常有用的,我们在开发中有新的内容不再需要删除掉数据库而重新创建一个,可以直接用migrate来更新数据库.

现在总结导致model发生改变的三个步骤:

  • models的修改(models.py)
  • 运行 makemigrations 创建这些改变的migrations
  • 运行 migrate 应用这些改变
Playing with the API
$ python manage.py shell

进入命令行界面后:

>>> from polls.models import Question, Choice

>>> Question.objects.all()
[]

>>> from django.utils import timezone
>>> q = Question(question_text="What‘s new?", pub_date=timezone.now())
>>> q.save()

>>> q.id
1

>>> q.question_text
"What‘s new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

>>> q.question_text = "What‘s up?"
>>> q.save()

>>> Question.objects.all()
[<Question: Question object>]

最后显示object.all()的时候仅仅是对象的简单描述,不方便查看,这里可以重写polls/models.py中Question的 __str__()函数(在python2中是__unicode__())

class Question(models.Model):
    ...
    def __str__(self):
        return self.question_text

class Choice(models.Model):
    # ...
    def __str__(self):              # __unicode__

增加一个查看是否是最近发布的函数:

class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

再次使用命令行交互:

>>> from polls.models import Question, Choice

>>> Question.objects.all()
[<Question: What‘s up?>]

>>> Question.objects.filter(id=1)
[<Question: What‘s up?>]

>>> Question.objects.filter(question_text__startswith=‘What‘)
[<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?>
>>> Question.objects.get(pk=1)
<Question: What‘s up?>

# Make sure our custom method worked.
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

# Create three 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)

>>> c.question
<Question: What‘s up?>

# And vice versa: Question objects get access to Choice objects.
>>> q.choice_set.all()
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
>>> q.choice_set.count()
3

>>> Choice.objects.filter(question__pub_date__year=current_year)
[<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]

# Let‘s delete one of the choices. Use delete() for that.
>>> c = q.choice_set.filter(choice_text__startswith=‘Just hacking‘)
>>> c.delete()
时间: 2024-08-09 04:07:01

Django tutorial part1的相关文章

Django Tutorial 学习笔记

实际操作了Django入门教程中的范例,对一些细节有了更清晰的掌握.感觉只看文档不动手是不行的,只看文档没法真正掌握其中要素之间的关系,看了很多遍也不行,必须动手做了才能掌握.同时,这次练习在Eclipse+PyDev环境下进行,了解了这个开发环境对Django的支持情况. Django网站提供的入门教程: https://docs.djangoproject.com/en/1.6/intro/tutorial01/ 教程中的数据库结构 Poll {question, pub_date} Cho

Django tutorial part4

writing_first_django_app_part4 Write a simple form 点击每个Question进去detail界面,看到的vote我们希望以选择的形式给用户进行选择,然后将结果以表格的形式POST到服务器. # polls/templates/polls/detail.html <h1>{{ question.question_text }}</h1> {% if error_message %}<p><strong>{{ e

Django tutorial part5

writing_first_django_app_part5 Automated Testing 解决问题一个很好的方法是首先描述这个问题,然后写出代码来实现它.但是很多人习惯先写好代码然后再进行调试找问题.也许在写代码之前先写好一些测试会是更好的选择. A little bug 前面在我们的Question.was_published_recently()函数中有一个小问题,如果它是一天之内创建的则会返回True,但是如果pub_date是未来的时间也会返回True 通常应用的测试会放到tes

Django tutorial part2

writing_first_django_app_part2 Create super user 下面开始创建管理者帐号: $ python manage.py createsuperuser 输入用户名和密码,邮箱之后创建帐号 运行runserver之后,进入http://127.0.0.1:8000/admin/ 可以登录管理界面 登录之后这时在管理界面还没能看到我们的poll应用,我们需要告诉admin我们的Question对象需要在管理界面显示,修改polls/admin.py: fro

Django tutorial part3

writing_first_django_app_part3 在Django中,网页和其他内容都是通过views来呈现的,每个view由一个简单的python函数来表示,django通过检查url来选择一个view URL pattern: URL的简单通用形式, eg: /newsarchive/<year>/<month>/ python用'URLconfs'来将URL patterns匹配到views 先看一个简单view的例子 # polls/view.py from dj

Django tutorial part6

writing_first_django_app_part6 在django中,网页应用中的一些附加文件,如image, JS, CSS等,称为静态文件"static files" django.contrib.staticfiles: 从各个应用中收集静态文件,放到一个单独的位置,方便使用和管理 Using CSS 静态文件查找路径的时候与template类似,首先在polls目录下创建目录static,在里面再创建一个polls目录,在这个polls目录里面才放置静态文件,现在创建

Django学习 part1

Django是一个由python写成的,开源的Web框架. Web框架本质: web服务,本质上都是socket HTTP协议分为 1:请求(request) 2:相应(response) 消息格式: 1.请求 请求头: 请求体: 2.响应 响应头: 响应体: GET和POST方法: get:获取一个网页或者搜索引擎检索的时候一般都用GET,数据都以明文拼接到URL上. post:表单提交等操作用form方法,数据放在请求体中. Django的重要思想理念就是松耦合--一种软件开发方式,其价值在

Pyhon + Django 1.7.2 tutorial + virtualenv简单使用

最近换了工作, 进的team项目中大概是个python + django的组合, python本身的语法以及特性撸过一边之后,这两天按着django官方的文档倒腾了几天, 文档非常详细,本人英语水平也就那样,基本没什么压力,建议像我一样的新手直接去看官方文档,首先内容绝对是更新到了最新的版本,内容组织渐进有序,当然咯,就算按照文档一步一步来,倒腾的过程中总归会碰到些问题,这边博文权当给个记个流水账以后能翻翻或者说有更深的理解了顺便来update下,看看自己的一些思考方式,若果顺便也能给其他人带来

实战Django:Rango Part2

  在这一节,我们将学习如何用自动脚本来添加内容,然后给我们的应用添加首页和一个内容页. 9.Part1练习答案 除了加入views和likes两个字段,这里我们需要思考一个问题,用户将如何来访问我们的页面?用/rango/category/1/ 或 /rango/category/2/?他们怎么知道1代表哪个分类,2又代表哪个分类?有没有更直接一点的方法呢? 我想还是直接用分类名称来作为链接的一部分会比较好一些,比如用/rango/category/Python/来访问Python分类这样子.