Django Web开发入门基础

2023-09-21 10:50:15

官方有很详细的文档,但是看过几遍之后如果要翻找还是有点麻烦,本文算作是学习笔记,提取一些关键点记录下来,另附上官方教程 Writing your first Django app

注: 文中的指令使用py,是在Windows上,macOS要使用 python3

 1. 安装Django

Django 是一个基于 Python 的Web开发框架,安装前可以用下面的命令检查是否安装了 Django,如果已经安装,会显示版本,没有安装会提示没有该模块

py -m django --version

如果没有安装,可以使用下面的命令安装

py -m pip install Django

2. 创建项目

项目就是一个 project,一个项目可以包含多个 app,也可以理解为多个模块,创建项目使用如下命令,其中 mysite 是项目名称:

django-admin startproject mysite

在令窗口中,切到刚刚创建的项目的根目录(有 manage.py),在项目中创建一个app,名字就叫 polls

py manage.py startapp polls

 然后修改几个文件

polls/views.py

from django.http import HttpResponse

def index(request):
    return HttpResponse("Hello World!")

polls/urls.py

from django.urls import path
from . import views

urlpatterns = [
    path("", views.index, name="index"),
]

mysite/urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path("admin/", admin.site.urls),
]

 最后启动服务,浏览器访问 http://localhost:8000/polls/

py manage.py runserver

3. 配置语言和时区 

项目配置在 mysite/settings.py

语言标识可以在这里查找 Language Identifiers (RFC 3066)

# 语言设置为中文
LANGUAGE_CODE = 'zh-Hans'

时区标识可以在这里查找 List of tz database time zones 

# 时区设置为北京时间
TIME_ZONE = 'Asia/Shanghai'

4. 数据库

就使用自带的 SQLite 吧,方便又简单,如果开发商用的Web App,建议使用其他数据库,要进行额外的配置。

(1)创建数据模型

修改 polls/models.py

import datetime

from django.db import models
from django.utils import timezone

class Question(models.Model):
	question_text = models.CharField(max_length=200)
	pub_date = models.DateTimeField("date published")

	def __str__(self):
		return self.question_text

	def was_published_recently(self):
		return self.pub_date >= timezone.now() - datetime.timedelta(days=1)


class Choice(models.Model):
	# Choice属于一个Question
	question = models.ForeignKey(Question, on_delete=models.CASCADE)
	choice_text = models.CharField(max_length=200)
	votes = models.IntegerField(default=0)

	def __str__(self):
		return self.choice_text

(2)激活模型

修改 mysite/settings.py,在 INSTALLED_APP 中添加 polls.apps.PollsConfig

INSTALLED_APPS = [
    "polls.apps.PollsConfig",
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
]

(3)创建数据迁移(尚未提交)

py manage.py makemigrations polls

查看创建的迁移使用的SQL语句,下面命令中的 0001 是上面创建迁移时生成的 polls/migrations/0001_initial.py 文件名中的数字

py manage.py sqlmigrate polls 0001

(4)提交迁移

py manage.py migrate

总结起来就三步:修改模型 -> 创建迁移 -> 提交迁移

 (5)玩转数据库API

打开交互式窗口

py manage.py shell
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet []>
>>> 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=datetime.timezone.utc)
>>> q.question_text = "What's up?"
>>> q.save()
>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>
>>> from polls.models import Choice, Question
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith="What")
<QuerySet [<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(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.
>>> Question.objects.get(pk=1)
<Question: What's up?>
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True
>>> q = Question.objects.get(pk=1)
>>> q.choice_set.all()
<QuerySet []>
>>> 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?>

>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> c = q.choice_set.filter(choice_text__startswith="Just hacking")
>>> c.delete()

5. 创建管理员

 输入下面的命令,然后根据提示设置账户名,邮箱,密码

py manage.py createsuperuser

启动服务,浏览器访问 http://127.0.0.1:8000/admin/

py manage.py runserver

修改 polls/admin.py 让管理员可管理数据

from django.contrib import admin

from .models import Question

admin.site.register(Question)

管理员登录后

6. 使用 html 模板

(1)创建 HTML 文件

在 polls/ 目录下新建一个 templates 文件夹,在 polls\templates\ 目录下新建一个 polls 文件见,如果新建一个 HTML 文件,比如 index.html,其最终的路径为 mysite\polls\templates\polls\index.html,代码中将使用 polls\index.html

polls\templates\polls\index.html

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="{% url 'index' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}

 polls\templates\polls\detail.html

<h1>{{ question.question_text }}</h1>
<ul>
{% for choice in question.choice_set.all %}
    <li>{{ choice.choice_text }}</li>
{% endfor %}
</ul>

(2)配置 view

修改 polls/views.py

from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404

from .models import Question

def index(request):
	latest_question_list = Question.objects.order_by("-pub_date")[:5]
	context = {"latest_question_list": latest_question_list}
	return render(request, "polls/index.html", context)

def detail(request, question_id):
	question = get_object_or_404(Question, pk=question_id)
	context = {"question": question}
	return render(request, "polls/detail.html", context)

def results(request, question_id):
	return HttpResponse("Results")

def vote(request, question_id):
	return HttpResponse("Vote")

(3)配置 url

修改 polls/urls.py

from django.urls import path

from . import views

urlpatterns = [
    # ex: /polls/
    path("", views.index, name="index"),
    # ex: /polls/5/
    path("<int:question_id>/", views.detail, name="detail"),
    # ex: /polls/5/results/
    path("<int:question_id>/results/", views.results, name="results"),
    # ex: /polls/5/vote/
    path("<int:question_id>/vote/", views.vote, name="vote"),
]

(4)URL命名空间

当项目存在多个应用时,可能需要借助命名空间来确定url,在应用的 urls.py 中配置 app_name

from django.urls import path

from . import views

app_name = "polls"
urlpatterns = [
    # ex: /polls/
    path("", views.index, name="index"),
    # ex: /polls/5/
    path("<int:question_id>/", views.detail, name="detail"),
    # ex: /polls/5/results/
    path("<int:question_id>/results/", views.results, name="results"),
    # ex: /polls/5/vote/
    path("<int:question_id>/vote/", views.vote, name="vote"),
]

index.html 中添加 app_name:

{% if latest_question_list %}
    <ul>
    {% for question in latest_question_list %}
        <li><a href="{% url 'polls:index' question.id %}">{{ question.question_text }}</a></li>
    {% endfor %}
    </ul>
{% else %}
    <p>No polls are available.</p>
{% endif %}
更多推荐

Json-Jackson和FastJson

狂神:测试Jackson纯Java解决日期格式化设置ObjectMapperFastJson:知乎:Jackson使用指南1、常见配置方式一:yml配置spring.jackson.date-format指定日期格式,比如yyyy-MM-ddHH:mm:ss,或者具体的格式化类的全限定名spring.jackson.t

从「思想实验」中学习,自监督 AI 模型向科学家看齐

年初ChatGPT爆火,美国《时代周刊》发文揭露其背后的「血汗工厂」,给「AIGC领头羊」耀眼的光环蒙上了一层巨大阴影。据报道,为训练ChatGPT识别有害内容,一群来自肯尼亚、乌干达和印度的外包员工负责给数据库手动标注,他们每天花费9小时鉴别各种攻击性词汇,每小时至多标注2万个单词,收获是1.32-2美元的时薪以及持

基于LiDAR的对象检测中的课程化对象操作

论文标题:CurricularObjectManipulationinLiDAR-basedObjectDetection代码:https://github.com/ZZY816/COM导读本文探讨了LiDAR传感器在自动驾驶等安全关键应用中的3D物体检测任务,并引入了一种创新的训练框架,被称为"curricularo

Qt(day3)

思维导图小练习second.h#ifndefSECOND_H#defineSECOND_H#include<QWidget>#include<QLabel>#include<QLineEdit>#include<QPushButton>#include<QTimerEvent>#include<QTime>#inclu

U盘提示格式化怎么办?3个方法轻松解决!

“我的u盘已经很久没用了,今天刚把u盘插入电脑就显示需要进行格式化。但是我还有很多重要的文件都保存在里面呢。这可怎么办呀?有什么方法恢复里面的数据吗?”u盘是我们日常生活中常用的移动存储设备之一,但有时可能会遇到一个让人烦恼的问题,那就是当插入U盘时,系统可能会弹出“u盘提示格式化”字样。这种情况可能导致数据丢失,因此

软件测试的方法总结

根据利用的被测对象信息的不同,可以将软件测试方法分为:黑盒测试、灰盒测试、白盒测试。1、白盒测试1)概念:是依据被测软件分析程序内部构造,并根据内部构造分析用例,来对内部控制流程进行测试,可完全不顾程序的整体功能实现情况,即已知软件产品的内部实现过程,可以通过测试证明每种内部操作是否符合设计规格的要求,所有内部成分是否

常用设计模式总结

策略模式定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。观察者模式在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象就会收到通知,并自动更新。观察者定义了对象之间一对多的关系主题(也就是可观察者)用一个共同的接口来更新观察者观察者与可观察者之间用松耦合方式结

Scala 高阶:Scala中的模式匹配

一、概述Scala中的模式匹配(case)类似于Java中的switch...case,但是Scala的模式匹配功能更为强大。通过模式匹配,可以匹配更复杂的条件和数据结构,包括常量、类型、集合、元组等。而Java的switch语句只能用于匹配整型或枚举类型。二、基本语法Javapublicstaticvoidmain(

详解ESP32模块的引脚分配图和定义

最近在研究单片机,买了一块ESP32开发板,记录一下所有引脚的定义。ESP32的优势之一是它的GPIO比ESP8266多得多。您不必兼顾或多复用IO。有几件事要注意,因此请仔细查看引脚分配图。ESP32外围设备和I/O尽管ESP32总共有48个GPIO引脚,但其中只有25个引出到开发板两侧的插头。这些引脚可以分配给各种

SOCKS5 认证的方法

在进行网络浏览或爬虫等相关工作时,我们经常会遇到需要使用SOCKS5代理认证的情况。然而,某些浏览器可能不提供原生支持SOCKS5代理认证的选项,给我们带来了一些困扰。本文将为大家介绍几种解决浏览器不支持SOCKS5代理认证问题的方法。一、使用代理转发工具1.使用Privoxy:Privoxy是一款开源的代理转发工具,

通讯网关软件002——利用CommGate X2HTTP-U实现HTTP访问OPC UA Server

本文介绍利用CommGateX2HTTP-U实现HTTP访问OPCUAServer。CommGateX2HTTP是宁波科安网信开发的网关软件,软件可以登录到网信智汇(wangxinzhihui.com)下载。【案例】如下图所示,实现上位机通过HTTP来获取OPCUAServer的数据。【解决方案】设置网关机,与OPCU

热文推荐