Django入门1

Django 我单独起个标题,因为页数有点多,且第一次接触后端的知识。

Django 是一个 web 框架 —— 一套用于帮助开发交互式网站的工具。

18.1 建立项目

我是在 window10 下创建这个项目的。

18.1.2 建立虚拟环境

为项目新建一个目录,将其命名为 learning_log,再在终端切换到这个目录。

python -m venv 11_env

18.1.3 安装 virtualenv

pip install --user virtualenv

18.1.4 激活环境

11_env\Scripts\activate

18.1.5 安装 Django

pip install Django

18.1.6 在 Django 中创建项目

Django-admin.py startproject learning_log .

一定要注意后面那个点不要忘了。

18.1.7 创建数据库

python manage.py migrate

可能会出现错误,尝试升级 pip 与 Django 版本应该能解决。

18.1.8 查看项目

python manage.py runserver

启动服务器,之后打开浏览器输入 127.0.0.1:8000,可查看是否搭起环境,如果要关闭这个服务器,可以按CRTL + C。

18.2 创建应用程序

当前,在前面打开的终端运行着 runserver,所以请再打开一个终端。

python manage.py startapp learning_logs

18.2.1 定义模型

修改 models.py

class Topic(models.Model):
    text = models.CharField(max_length=200)
    date_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        '''返回模型的字符串表示'''
        return self.text

18.2.2 激活模型

修改 setting.py

#注册
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    #我的程序
    'learning_logs',
]

迁移数据库

python manage.py makemigrations learning_logs

应用迁移

python manage.py migrate

每当需要修改时,基本为三步:1.修改 models.py ; 2.对 learning_logs 调用 makemigrations;3.让 Django 迁移。

18.2.3 Django 管理网站

1.创建超级用户

python manage.py createsuperuser

会提示数据名字和email和密码。

建立好之后,再次打开数据库,你会发现在auth_user中多了条记录,名字是你自己起的,密码是散列。

2.注册模型

修改 admin.py

from django.contrib import admin

# Register your models here.
from learning_logs.models import Topic

admin.site.register(Topic)

3.添加主题

18.2.4 定义模型 Entry

修改 models.py

-- snip --
class Entry(models.Model):
    '''学到的有关某个主题的具体知识'''
    # Entry 建立了三个字段,topic,text和 date_added。

    #解决TypeError: __init__() missing 1 required positional argument: 'on_delete'
    #少位置参数on_delete,重新指定外键方式
    topic = models.ForeignKey(Topic,on_delete=models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add=True)

    #Meta 存储用于管理模型的额外信息
    class Meta:
        verbose_name_plural = 'entries'

    def __str__(self):
        '''返回模型的字符串表示'''
        return self.text[:50] + '...'

18.2.5 迁移模型

python manage.py makemigrations learning_logs

python manage.py migrate

18.2.6 注册 Entry

修改 admin.py

from django.contrib import admin

# Register your models here.
from learning_logs.models import Topic, Entry

admin.site.register(Topic)
admin.site.register(Entry)

18,2,7 Django shell

输入了一些数据之后,就能通过交互式的编程方式查看这些数据了。这种交互式环境称为 Django shell。

python manage.py shell

>>> from learning_logs.models import Topic
>>> Topic.objects.all()

[<Topic: Chess>, <Topic: Rock Climbing>]

18.3 创建网页:学习笔记主页

使用Django创建网页的几个步骤:

  1. 定义URL

  2. 编写视图函数

  3. 编写模板

18.3.1 映射 URL

打开learning_log下面的文件urls

from django.conf.urls import url, include
from django.contrib import admin

# 该模块定义了可在管理网站中请求的所有 URL

urlpatterns = [
    #去掉第一个url后的include(),不然报错
    url(r'^admin/',admin.site.urls),
    # 实参 namespace,让我们能够将 learning_logs 的 URL 同项目中的其他 URL 区分开来。

    url(r'', include('learning_logs.urls', namespace='learning_logs')),
]

打开 learning_logs,创建另一个 url

from django.conf.urls import url
from . import views

'''定义 learning_logs 的 URL 模式'''
# 该模块定义了可在管理网站中请求的所有 URL
urlpatterns = [

    # url() 的第一个参数是正则表达式,第二个是要调用的视图函数,第三个是这个 URL 模式的名称
    # r:让 python 将接下来的字符串视为原始字符串
    # ^:查看字符串开头
    # $:查看字符串末尾
    # (r'^$'):即表示头尾没有任何东西的 URL(python 默认忽略项目的基础 URL(http://localhost:8080/)),
    # 所以这个正则表达式匹配基础 URL。

    # 主页
    url(r'^$', views.index, name='index'),

    # 显示所有主题
    url(r'^topics/$', views.topics, name='topics'),

    # 特定主题的详细页面
    url(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'),

]
#与书本上版本不一样,注意添加这个(书上没有)
app_name = "learning_logs"

18.3.2 编写视图

view.py

from django.shortcuts import render
from .models import Topic

# Create your views here.


def index(request):
    '''学习笔记的主页'''
    return render(request, 'learning_logs/index.html')
    # URL 请求与我们刚才定义的模式匹配时,Django 将在文件 views.py 中查找函数 index(),再将
    # 请求对象传递给这个视图函数。

def topics(request):
    '''显示所有主题'''
    topics = Topic.objects.order_by('date_added')
    context = {'topics':topics}
    return render(request,'learning_logs/topics.html',context)



def topic(request,topic_id):
    '''显示单个主题以其所有条目'''


    topic = Topic.objects.get(id=topic_id)
    entries = topic.entry_set.order_by('-date_added')
    context = {'topics': topics, 'entries': entries}
    return render(request, 'learning_logs/topic.html', context)

18.3.2 编写模板

base.html

<p>
  <a href="{% url 'learning_logs:index' %}">Learning Log</a> -
  <a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>

{% block content %}{% endblock %}

index.html

{% extends "learning_logs/base.html" %}

{% block content %}
  <p>Learning Log helps you keep track of your learning, for any topic you're 
  learning about.</p>
{% endblock content %}

topic.html

{% extends 'learning_logs/base.html' %}

{% block content %}

  <p>Topic: {{ topic }}</p>

  <p>Entries:</p>
  <ul>
  {% for entry in entries %}
    <li>
      <p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
      <p>{{ entry.text|linebreaks }}</p>
    </li>
  {% empty %}
    <li>
      There are no entries for this topic yet.
    </li>
  {% endfor %}
  </ul>

{% endblock content %}

topics.html

{% extends "learning_logs/base.html" %}

{% block content %}

  <p>Topics</p>

  <ul>
    {% for topic in topics %}
      <li>
        <a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
     </li>
    {% empty %}
      <li>No topics have been added yet.</li>
    {% endfor %}
  </ul>

{% endblock content %}

模板继承:

创建网页时,几乎都有一些索引网页包含的元素,在这种情况下可以编写一个包含通用的元素的父模板。

模板标签:

{% %}:生成页面显示的信息

总之,今天的内容主要有 2 个套路。

套路1:

  1. 定义模型
  2. 生成迁移文件
  3. 迁移数据库

套路2:

  1. 定义URL
  2. 编写视图函数
  3. 编写模板

今天就这样了,清明期间有点累,基本没看书,从今天开始调整状态。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容