[翻译] Django1.11 Django at a glance

初识Django

英文原文地址

在这文章之前,你应该注册了APP

  • Django它的目的是使普通的Web开发任务变得更快更容易。本文是介绍如何用Django编写一个数据库驱动的Web应用程序。

  • 本文的目的是给你足够的技术细节去了解Django的大概运作,但这并非是一个完整的教程或参考!当您准备启动一个项目时,您可以从教程开始,或者直接进入更详细的文档中。


设计你的model

  • 虽然没有数据库你也可以使用Django,它是一个ORM(对象关系映射)可以在在Python代码中写出数据库实体的设计。
  • 数据模型语法提供了许多表示模型的丰富方法,到目前为止,它已经解决了多年的database-schema问题。下面是一个例子:

mysite/news/models.py

from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)

    def __str__(self):     # __unicode__ on Python 2
        return self.full_name

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):     # __unicode__ on Python 2
        return self.headline

使model生效

  • 接下来,通过命令行来运行的Django,自动创建数据库表:
$ python manage.py migrate

migrate命令查看所有可用的model,并在数据库中创建表,也可以提供更丰富的schema控制。


使用免费的API

  • 使用一个免费的,丰富的 Python API 去访问数据库,API是即时创建的,不需要代码。
#从我们的'news'app中import我们创建的models
>>> from news.models import Reporter, Article

# 在数据库中没有Reporter数据
>>> Reporter.objects.all()
<QuerySet []>

# 创建一个新的Reporter
>>> r = Reporter(full_name='John Smith')

# 用 save() 将这一行保存进数据库
>>> r.save()

# Django自动给每个表格加上了一列id
>>> r.id
1

# 现在新创建的Reporter存在数据库中
>>> Reporter.objects.all()
<QuerySet [<Reporter: John Smith>]>

# 表格的字段是 python类中的属性
>>> r.full_name
'John Smith'

# Django 提供了丰富的数据库查找API.
>>> Reporter.objects.get(id=1)
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__startswith='John')
<Reporter: John Smith>
>>> Reporter.objects.get(full_name__contains='mith')
<Reporter: John Smith>
>>> Reporter.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Reporter matching query does not exist.

# Create an article.
>>> from datetime import date
>>> a = Article(pub_date=date.today(), headline='Django is cool',
...     content='Yeah.', reporter=r)
>>> a.save()

# Now the article is in the database.
>>> Article.objects.all()
<QuerySet [<Article: Django is cool>]>

# Article objects get API access to related Reporter objects.
>>> r = a.reporter
>>> r.full_name
'John Smith'

# 反之: Reporter 通过API得到Article 类实例.
>>> r.article_set.all()
<QuerySet [<Article: Django is cool>]>

# The API follows relationships as far as you need, performing efficient
# JOINs for you behind the scenes.
# This finds all articles by a reporter whose name starts with "John".
>>> Article.objects.filter(reporter__full_name__startswith='John')
<QuerySet [<Article: Django is cool>]>

# 改变已近存在的实体的属性,要是用save()保存.
>>> r.full_name = 'Billy Goat'
>>> r.save()

# Delete an object with delete().
>>> r.delete()

一个动态管理界面:功能十分完整

  • 一旦定义了你的models,Django可以自动创建一个专业、可直接使用的管理界面,它是一个可以让用户添加、更改和删除对象的网站。这就像在管理站点注册你的模型一样简单:

mysite/news/admin.py

from django.contrib import admin

from . import models
# 在model中创建的类再 admin中注册
admin.site.register(models.Article) 
  • 这里的理念是,你的网站由一个工作人员,或者一个客户,或者可能是你自己编辑的,你不想为了管理内容而创建后端接口。

设计你URLs

  • 干净、优雅的URL方案是高质量Web应用程序中的一个重要细节。Django鼓励漂亮的URL的设计并没有提出任何令人讨厌的东西在URL中

  • 为app设计URLs,在Python模块中叫 URLconf,
    这个模块是纯Python代码,是URL表达式(简单正则表达式)到Python函数(views)之间的简单映射。

mysite/news/urls.py

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
  • 正则表达式使用括号来从URL捕获“值”。可以传入你的views中,当用户请求一个页面时,Django从上至下匹配url中的正则表达式。并停在第一个与之匹配的url这里(如果没有匹配成功,则返回一个404页面),这是极快的,因为正则表达式在加载时编译。
  • 一旦一个表达式匹配,Django调用给定的视图,这是一个简单的Python函数。每个视图会得到请求对象(包含正则表达式请求元数据–和捕获的值。)
  • 例如,如果一个用户请求的URL “/articles/2005/05/39323/”,Django会调用news.views.article_detail(request, ‘2005’, ‘05’, ‘39323’).

编写你的视图

  • 每个视图负责做两件事:返回包含页面内容的HttpResponse对象,或者抛出一个异常,如404。
  • 一般来说,views根据传过来的参数检索数据,加载模板,并用检索的数据呈现模板。如:

mysite/news/views.py

from django.shortcuts import render

from .models import Article

def year_archive(request, year):
    a_list = Article.objects.filter(pub_date__year=year)
    #Django 1.11 中想html页面传递参数只能用dict
    context = {'year': year, 'article_list': a_list}
    return render(request, 'news/year_archive.html', context)

设计你的templates

  • 上面的code加载了‘news/year_archive.html’ template。

  • Django有一个templates 的搜索路径,你可以尽量减少多余的模板。在你的项目中,你指定一个检查templates 目录的目录列表。如果第一个目录中不存在templates ,则它会检查第二个目录,等等。

  • 让我们看看‘news/year_archive.html’ template是什么样子的。

mysite/news/templates/news/year_archive.html

<!-- extend 继承base.html文件,base.html文件需要自己编写-->
{% extends "base.html" %}

<!-- 完成base.html的title block,base.html的title block为空,等待继承后对其内容进行编写-->

{% block title %}Articles for {{ year }}{% endblock %}

{% block content %}
<h1>Articles for {{ year }}</h1>

{% for article in article_list %}
    <p>{{ article.headline }}</p>
    <p>By {{ article.reporter.full_name }}</p>
    <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
{% endfor %}
{% endblock %}
  • 变量被双花括号包围。{ { article.headline } }意味着“输出文章的标题属性的值。”。值由views编写的方法中用dict传递的context传递。

  • 注意{{ article.pub_date|date:”F j, Y” }}使用Unix风格的“pipe”(“|”字)。这称为模板筛选器,它是过滤变量值的一种方法。

  • 最后,Django采用了模板继承的方式, {% extends “base.html” %} 做.它的意思是,首先加载”base.html”模板,base.html定义了一组block,然后用下面的block填充这些block。”简而言之,这样可以大大减少模板中的冗余.

mysite/templates/base.html

{% load static %}
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <img src="{% static "images/sitelogo.png" %}" alt="Logo" />
    {% block content %}{% endblock %}
</body>
</html>
  • 简单的说,它定义了网站的外观和感觉(比如网站的logo),并提供洞(block)供child template去填充。这使得站点重新设计只要更改 base.html一样简单。
  • 它还允许使用不同的base.html创建网站的多个版本( mobile versions )。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值