使用MTV 格式进行增删改查找
简单的表单来提交数据
sudo pip3 install -U pip
pip install django==2.2.9
sudo apt update
sudo apt install libmysqlclient-dev
pip install ipython mysqlclient
start project
django-admin startproject myProject
ll
tree myProject
cd myProject
python3 manage.py startapp myApp
配置setting
启动
cd myProject
python3 manage.py runserver 0:8080
# myApp/views.py
from django.http import HttpResponseRedirect
from django.urls import reverse
def addBook(request):
if request.method == 'POST':
temp_name = request.POST['name']
temp_author = request.POST['author']
temp_pub_house = request.POST['pub_house']
from django.utils import timezone
temp_book = Book(name=temp_name, author=temp_author, pub_house=temp_pub_house, pub_date=timezone.now())
temp_book.save()
# 重定向
return HttpResponseRedirect(reverse('detail'))
view
model
因为 MyappConfig 类写在文件 myApp/apps.py 中,所以它的路径为 myApp.apps.MyappConfig。
# myApp/models.py
from django.db import models
class Book(models.Model):
name = models.CharField(max_length=200)
author = models.CharField(max_length=100)
pub_house = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
在设置文件中添加路径:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 'myApp', 这一注释掉,不注释掉会因重复而报错
'myApp.apps.MyappConfig',
]
```bash
python3 manage.py makemigrations myApp
python3 manage.py migrate
在 Django 中,ForeignKey
,OneToOneField
和 ManyToManyField
是用来定义不同类型的数据库关系的模型字段。
以下是这三种关系字段的使用例子:
1. ForeignKey
ForeignKey
用于定义 “一对多” 的关系。例如,一个作者可以写多本书,但是每本书只能有一个作者。在这种情况下,我们可以在 Book
模型中定义一个到 Author
模型的 ForeignKey
:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
on_delete=models.CASCADE
表示,如果关联的 Author
对象被删除,那么所有与之关联的 Book
对象也将被删除。
2. OneToOneField
OneToOneField
用于定义 “一对一” 的关系。例如,一个用户只能有一个用户配置,一个用户配置也只能属于一个用户。在这种情况下,我们可以在 Profile
模型中定义一个到 User
模型的 OneToOneField
:
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
avatar = models.ImageField(upload_to='avatars/')
on_delete=models.CASCADE
表示,如果关联的 User
对象被删除,那么与之关联的 Profile
对象也将被删除。
3. ManyToManyField
ManyToManyField
用于定义 “多对多” 的关系。例如,一本书可以有多个作者,一个作者也可以写多本书。在这种情况下,我们可以在 Book
模型中定义一个到 Author
模型的 ManyToManyField
:
class Author(models.Model):
name = models.CharField(max_length=100)
class Book(models.Model):
title = models.CharField(max_length=200)
authors = models.ManyToManyField(Author)
在这个例子中,我们可以创建多个 Author
对象并将它们关联到同一本 Book
,也可以将同一 Author
关联到多本 Book
。
这就是 Django 中 ForeignKey
,OneToOneField
和 ManyToManyField
的基本用法。要了解更多信息,你可以参考 Django 官方文档。
template
Django 模板语法
Django 的模板系统采用了一种简洁、易理解的语言,允许你在 Python 应用中生成任意格式的文本。下面是 Django 模板中的一些常用语法。
1. 变量
在模板中,你可以使用变量。变量名必须由字母、数字、下划线和点组成,不能包含空格。变量是通过 {{ variable }}
的形式表示的。
<p>My name is {{ name }}.</p>
2. 标签
标签提供了模板的逻辑。标签是通过 {% tag %}
的形式表示的。以下是一些常用的标签:
-
for ... endfor
:用于循环。<ul> {% for item in item_list %} <li>{{ item }}</li> {% endfor %} </ul>
-
if ... elif ... else ... endif
:用于条件判断。{% if user.is_authenticated %} <p>Welcome, {{ user.username }}.</p> {% else %} <p>Please log in.</p> {% endif %}
-
block ... endblock
:用于定义在子模板中可以被覆盖的区块。{% block content %}{% endblock %}
-
extends
:用于表示当前模板是继承于另一模板的。{% extends "base.html" %}
-
include
:用于包含另一个模板的内容。{% include "header.html" %}
-
csrf_token
:用于跨站请求伪造保护。<form method="post"> {% csrf_token %} </form>
3. 过滤器
过滤器提供了一种在变量被显示之前修改它的方式。过滤器是通过 {{ variable|filter }}
的形式表示的。例如,你可以使用 date
过滤器来格式化日期。
<p>The date is {{ today|date:"F j, Y" }}.</p>
(https://docs.djangoproject.com/en/stable/topics/templates/)。
接续之前的介绍,我们可以进一步了解 Django 模板的一些更深层次的概念和用法。
1. 模板继承
Django 的模板系统支持模板继承,这是避免重复的强大工具。你可以创建一个基础模板(base template),然后定义一些可以被子模板覆盖的块(block)。子模板可以继承这个基础模板,并且可以覆盖这些块。
例如,创建一个基础模板 base.html
:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Default Title{% endblock %}</title>
</head>
<body>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
然后,创建一个继承自 base.html
的模板 my_page.html
:
{% extends "base.html" %}
{% block title %}My Page{% endblock %}
{% block content %}
<h1>Welcome to my page!</h1>
{% endblock %}
2. 使用变量
在模板中,你可以访问传递给模板的任何变量。比如,如果你在视图函数中传递了一个名为 article
的变量,你可以在模板中直接使用 {{ article.title }}
访问文章的标题。
def article_view(request):
article = Article.objects.get(id=1)
return render(request, 'article.html', {'article': article})
然后,在 article.html
模板中:
<h1>{{ article.title }}</h1>
<p>{{ article.content }}</p>
3. 自定义过滤器和标签
虽然 Django 提供了许多内置的过滤器和标签,但有时候你可能会需要创建自定义的过滤器和标签。你可以在一个 Python 模块中定义这些过滤器和标签,然后在模板中使用 {% load %}
标签来加载它们。
例如,定义一个自定义过滤器 lower
:
from django import template
register = template.Library()
@register.filter
def lower(value):
return value.lower()
然后,在模板中使用它:
{{ "HELLO"|lower }}
以上就是 Django 模板的一些更深层次的概念和用法。我希望这些信息对你有所帮助。如果你想了解更多,我建议你阅读 Django 的官方文档,那里有更详细的信息。
post
request.POST 是一个类字典对象,可以通过关键字的名字获取提交的数据。
redirection
HttpResponseRedirect 而不是常用的 HttpResponse,HttpResponseRedirect 只接收一个参数:用户将要被重定向的 URL。
reverse
reverse() 函数。这个函数避免了我们在视图函数中硬编码 URL
html
HTML (HyperText Markup Language) 是用来构建网页的标准标记语言。HTML 使用标记(tags)告诉浏览器如何呈现文本和图像。让我们开始学习吧!
HTML 文档结构
一个基本的 HTML 文档结构看起来像这样:
<!DOCTYPE html>
<html>
<head>
<title>页面标题</title>
</head>
<body>
<h1>我的第一个标题</h1>
<p>我的第一个段落。</p>
</body>
</html>
让我们来解析一下这个文档:
<!DOCTYPE html>
告诉浏览器这个是 HTML5 文档。<html>
元素是整个 HTML 页面的根元素。<head>
元素包含了所有的元信息,如标题、链接到 CSS 文件、字符编码声明等。<title>
元素描述了页面的标题,这个标题会显示在浏览器的标题栏或标签页上。<body>
元素包含了所有页面的可见内容,如标题、段落、图片、链接等。<h1>
定义了一个大标题。HTML 提供<h1>
到<h6>
六个等级的标题。<p>
定义了一个段落。
HTML 标签
HTML 使用标签来标记内容。一个标签通常包括开始标签和结束标签,例如 <p>
和 </p>
。以下是一些常见的 HTML 标签:
<h1>
到<h6>
: 定义标题。<h1>
是最大的标题,<h6>
是最小的标题。<p>
: 定义段落。<a>
: 定义超链接。<img>
: 定义图像。<ul>
和<li>
: 定义无序列表。<ol>
和<li>
: 定义有序列表。<table>
,<tr>
,<th>
,<td>
: 用来定义表格。
HTML 属性
HTML 标签可以有属性,属性提供了关于元素的更多信息。例如,<a>
标签的 href
属性定义了链接的地址:
<a href="https://www.example.com">这是一个链接</a>
练习
创建一个简单的 HTML 页面,包含一个标题、一个段落和一个链接,如下:
<!DOCTYPE html>
<html>
<head>
<title>我的页面</title>
</head>
<body>
<h1>欢迎来到我的页面!</h1>
<p>这是一个简单的HTML页面。</p>
<a href="https://www.example.com">点击这里</a> 访问example.com.
</body>
</html>
当然,让我们继续深入了解 HTML。
HTML 列表
HTML 提供了有序列表和无序列表的元素:
-
无序列表 使用
<ul>
标签,列表项使用<li>
标签:<ul> <li>咖啡</li> <li>茶</li> <li>牛奶</li> </ul> ```
-
有序列表 使用
<ol>
标签,列表项仍然使用<li>
标签:<ol> <li>咖啡</li> <li>茶</li> <li>牛奶</li> </ol> ```
HTML 图片
HTML 使用 <img>
标签插入图片。图片的地址在 src
属性中指定,alt
属性用于提供备用的文本描述:
<img src="coffee.jpg" alt="一杯咖啡的图片">
HTML 链接
HTML 使用 <a>
标签定义链接,链接的地址在 href
属性中指定:
<a href="https://www.example.com">访问 Example.com</a>
HTML 表格
HTML 使用 <table>
标签创建表格,<tr>
定义行,<th>
定义表头,<td>
定义单元格:
<table>
<tr>
<th>姓名</th>
<th>电子邮件</th>
</tr>
<tr>
<td>张三</td>
<td>zhangsan@example.com</td>
</tr>
</table>
HTML 表单
HTML 表单用于收集用户输入。表单使用 <form>
标签,输入字段使用 <input>
标签,提交按钮使用 <button>
标签:
<form>
<label for="fname">名字:</label><br>
<input type="text" id="fname" name="fname"><br>
<button type="submit">提交</button>
</form>