Django 杂记

python manage.py startapp app_name

python manage.py makemigrations

python manage.py migrate 

python manage.py flush

python manage.py runserver 

python manage.py runserver 8001

python manage.py runserver 0.0.0.0:8000

python manage.py shell

startapp 用于新建一个app 

makemigrations 命令用于查找所有可用的 models,为任意一个在数据库中不存在对应数据表model创建migration脚本文件。

migrate 命令用于运行这些 migrations 自动创建数据库表。

flush 会询问是 yes 还是 no, 选择 yes 会把数据全部清空掉,只留下空表

 

 

Django 自身包含了 orm 框架,可以使用其强大的 数据-模型语句来描述数据模型。

#mysite/news/models.py

from django.db import models

class Reporter(models.Model):
    full_name = models.CharField(max_length=70)
    
    def __str__(self):
    return self.full_name


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

    def __str__(self):
    return self.headline
#import the models we created from our "news" app

from new.models import Article, Reporter
from datetime import date

#no reporters are in the system yet
Reporter.objects.all()
#


#create a new Reporter
r = Reporter(fill_name='John Smith')

#save the object into the database. 
r.save()

#now r has an id
r.id
#1

#now the new reporter is in the database 
Reporter.objects.all()
#]

#fields are represented as attributes on the Python object
r.full_name
#'John Smith'

#django provides a rich database lookup API
Reporter.objects.get(id=1)
#
Reporter.objects.get(full_name_startwith='John')
#
Reporter.objects.get(full_name_contains='mith')
#

#create an article
a = Article(pub_date=date.today(), headline='Django is cool',
    content='Yeah.', reporter=r)
a.save()

#Article objects get API access to related Reporter objects
r = a.reporter
r.full_name

#Reporter objects get API access to Article objects
r.article_set.all()
#]>

#This finds all articles by a reporter whose name start with "John"
Article.objects.filter(reporter_full_name_startwith='John')
#]>

#change an object by altering its attributes and calling save()
r.full_name='Billy Goat'
r.save()

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

当你的模型完成定义,Django 就会自动生成一个专业的生产级 管理接口 -- 一个允许认证用户添加、更改和删除对象的web站点。只需要简单的在 admin 站点上注册模型即可。

#mysite/news/admin.py

from django.contrib import admin
from . import models

admin.site.register(models.Article)

创建一个叫做 URLconf 的 python 模块,这就是网站的目录,包含了一张 URL 和 Python 回调函数之间的映射表。URLconf 也有利于将 Python 代码与 URL 进行解耦。

#mysite/news/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('articles//', views.year_archive),
    path('articles///', views.month_archive),
    path('articles////, views.article_detail),
]

上述代码将 URL 路径映射到了 Python 回调函数(视图)。路径字符串使用参数标签从 URL 中捕获相应值。当用户请求页面时,Django 依次遍历路径,直到初次匹配到了请求的 URL。如果无匹配项,Django 会调用 404 视图。这个过程很快,因为路径在加载时就编译成了正则表达式。

一旦有 URL 路径匹配成功,Django 会调用相应的视图函数。每个视图函数会接受一个请求对象--包含请求元信息以及 URL 路径中包含的参数值。

视图函数的执行结果有两种:返回一个包含请求页面元素的 HttpResponse 对象,或是抛出 Http404 类异常。

#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)
    context = {'year':year, 'article_list':a_list}
    return render(request, 'news/year_archive.html', context)

Django 允许设置搜索模板路径,以最小化模板之间的冗余。Django 通过 DIRS 参数指定一个路径列表用于搜索模板。如果第一个路径中不包含任何模板,继续检查第二个。

#mysite/news/templates/news/year_archive.html

{% extends "base.html" %}

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

{% block content %}

Articles for {{ year }}

{% for article in article_list %}

{{ article.headline }}

By {{ article.reporter.full_name }}

Published {{ article.pub_date|date:"F j, Y" }}

<% endfor %> <% endblock %>

我们看到变量都被双大括号括起来了。 {{ article.headline }} 的意思是“输出 article 的 headline 属性值”。这个“点”还有更多的用途,比如查找字典键值、查找索引和函数调用。

我们注意到 {{ article.pub_date|date: "F j, Y" }} 使用了 Unix 风格的“管道符”(“|”字符)。这是一个模板过滤器,用过滤变量值。在这里过滤器将一个 Python datetime 对象转化为指定的格式(就像 PHP 中的日期函数那样)。

你可以将多个过滤器连在一起使用。你还可以使用你自定义的模板顾虑器。你甚至可以自己编写自定义的模板标签 ,相关的 Python 代码会在使用标签时在后台运行。

Django 使用了 ''模板继承'' 的概念。这就是 {{ % extends "base.html" %}} 的作用。它的含义是''先加载名为 base 的模板,并且用下面的标记块对模板中定义的标记块进行填充''。简而言之,模板继承可以使模板间的冗余内容最小化:每个模板只需包含与其它文档有区别的内容。

下面的 base.html 使用了静态文件

#mysite/templates/base.html

{% load static %}


    {% block title %}{% endblock %}


    Logo
    {% block content %}{% endblock %}

 

你可能感兴趣的:(Django)