- Django 基本概念
- Django - 首页
- Django - 基础
- Django - 概述
- Django - 环境
- Django - 创建项目
- Django - 应用生命周期
- Django - 创建视图
- Django - URL 映射
- Django - 首页
- Django - 模板系统
- Django - MVT
- Django - 添加主模板
- Django 管理员
- Django 管理员 - 界面
- Django 管理员 - 创建用户
- Django 管理员 - 包含模型
- Django 管理员 - 设置显示字段
- Django 管理员 - 更新对象
- Django 模型
- Django - 模型
- Django - 插入数据
- Django - 更新数据
- Django - 删除数据
- Django - 更新模型
- Django 静态文件
- Django - 添加静态文件
- Django - 添加 CSS 文件
- Django 高级
- Django - 页面未找到 (404)
- Django - 页面重定向
- Django - 发送电子邮件
- Django - 通用视图
- Django - 表单处理
- Django - 文件上传
- Django - Apache 设置
- Django - Cookie 处理
- Django - 会话
- Django - 缓存
- Django - 评论
- Django - RSS
- Django - AJAX
- Django 有用资源
- Django - 快速指南
- Django - 有用资源
- Django - 讨论
Django – 插入数据
Django 有自己的对象关系模型 (ORM),它将 Python 类与关系数据库中的表映射起来。ORM 机制有助于以面向对象的方式执行 CRUD 操作。在本章中,我们将学习插入新数据的方法。
默认情况下,Django 使用 SQLite 数据库。Django 中的模型是从“django.db.models”类继承的类。
让我们在“models.py”文件中使用以下Dreamreal 模型来学习如何在映射的表中插入数据:
from django.db import models
class Dreamreal(models.Model):
website = models.CharField(max_length=50)
mail = models.CharField(max_length=50)
name = models.CharField(max_length=50)
phonenumber = models.IntegerField()
class Meta:
db_table = "dreamreal"
声明模型后,我们需要执行迁移:
python manage.py makemigrations python manage.py migrate
从 Shell 插入对象
Django 具有一个有用的功能,您可以使用它在 Django 项目的环境中调用 Python shell。使用manage.py脚本的 shell 命令:
python manage.py shell
在 Python 提示符前,导入 Dreamreal 模型:
>>> from myapp.models import Dreamreal
我们可以构造此类的对象并调用其 save() 方法,以便在表中添加相应的行
>>> obj = Dreamreal(website="www.polo.com", mail="sorex@polo.com", name="sorex", phonenumber="002376970") >>> obj.save()
我们可以通过在任何 SQLite 查看器中打开数据库来确认这一点。
您还可以使用模型类的对象属性的 create() 方法插入记录。
>>> obj = Dreamreal.objects.create(website="www.polo.com", mail="sorex@polo.com", name="sorex", phonenumber="002376970")
通过调用视图函数执行插入操作
现在让我们通过调用视图函数来执行插入操作。在views.py文件中定义addnew()函数,如下所示:
from myapp.models import Dreamreal
def addnew(request):
obj = Dreamreal(website="www.polo.com", mail="sorex@polo.com", name="sorex", phonenumber="002376970")
obj.save()
return HttpResponse("<h2>Record Added Successfully")
我们需要将此视图注册到 URLpatterns 列表中。
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("addnew/", views.addnew, name='addnew')
]
与其像上述示例中那样使用硬编码值,不如希望从用户那里接受数据。为此,在myform.html文件中创建一个 HTML 表单。
<html>
<body>
<form action="../addnew/" method="post">
{% csrf_token %}
<p><label for="website">WebSite: </label>
<input id="website" type="text" name="website"></p>
<p><label for="mail">Email: </label>
<input id="mail" type="text" name="mail"></p>
<p><label for="name">Name: </label>
<input id="name" type="text" name="name"></p>
<p><label for="phonenumber">Phone Number: </label>
<input id="phonenumber" type="text" name="phonenumber"></p>
<input type="submit" value="OK">
</form>
</body>
</html>
HTML 模板文件必须存储在 TEMPLATES 设置中定义的目录中:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR/'templates'],
.. . .,
]
让我们使用 render() 函数显示表单模板:
from django.shortcuts import render
from myapp.models import Dreamreal
def addnew(request):
if request.method == "POST":
ws = request.POST['website']
mail = request.POST['mail']
nm = request.POST['name']
ph = request.POST['phonenumber']
obj = Dreamreal(website=ws, mail=mail, name=nm, phonenumber=ph)
obj.save()
return HttpResponse("<h2>Record Added Successfully</h2>")
return render(request, "myform.html")
请注意,表单的 action 属性也设置为映射 addnew() 函数的相同 URL。因此,我们需要检查 request.method。如果是 GET 方法,则呈现空白表单。如果是 POST 方法,则解析表单数据并将其用于插入新记录。
模型表单
Django 有一个ModelForm类,它会自动呈现一个 HTML 表单,其结构与模型类的属性匹配。
我们在应用文件夹下的forms.py文件中定义了一个DreamRealForm类,它使用Dreamreal 模型作为基础。
from django import forms
from .models import Dreamreal
class DreamrealForm(forms.ModelForm):
class Meta:
model = Dreamreal
fields = "__all__"
模型表单的对象在 HTML 表单上呈现。如果请求方法是 POST,则 ModelForm 类的 save() 方法会自动验证表单并保存新记录。
from .forms import DreamrealForm
def addnew(request):
if request.method == 'POST':
form = DreamrealForm(request.POST)
if form.is_valid():
form.save()
return HttpResponse("<h2>Book added successfully</h2>")
context={'form' : DreamrealForm}
return render(request, "myform.html", context)
CreateView 类
Django 定义了一组通用视图类。CreateView类专门用于执行 INSERT 查询操作。
我们定义CreateView类的子类,并将它的template_name属性设置为我们已经创建的myform.html。
在views.py文件中添加以下代码:
from django.views.generic import CreateView class DRCreateView(CreateView): model = Dreamreal fields = "__all__" template_name = 'myform.html' success_url = '../success/'
插入成功后,浏览器将重定向到 success() 视图函数。
def success(request):
return HttpResponse("<h2>Book added successfully</h2>")
上述两个视图都必须包含在urls.py文件的 URL 模式列表中。通用视图类使用它们的 as_view() 方法注册。
from django.urls import path
from . import views
from .views import DRCreateView
urlpatterns = [
path("", views.index, name="index"),
path("addnew/", views.addnew, name='addnew'),
path("add/", DRCreateView.as_view(), name='add'),
path("success/", views.success, name='success'),
]
在本章中,我们学习了在 Django 模型中插入数据的不同方法。