Django 简明教程
Django – Insert Data
Django 有自己的对象关系模型 (ORM),它将 Python 类与关系数据库中的表进行映射。ORM 机制有助于以面向对象的方式执行 CRUD 操作。在本章中,我们将学习插入新数据的不同方法。
By default, Django uses a SQLite database 。Django 中的模型是从“django.db.models”类继承的类。
让我们在“models.py”文件中使用以下 Dreamreal model 来了解如何在映射表中插入数据:
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"
在声明一个模型后,我们需要执行 migrations ——
python manage.py makemigrations
python manage.py migrate
Insert Object From 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 查看器中打开数据库来确认这一点。
你还可以使用模型类的 objects 属性的 create() 方法来插入记录。
>>> obj = Dreamreal.objects.create(website="www.polo.com",
mail="sorex@polo.com", name="sorex", phonenumber="002376970")
Perform Insert Operation by Calling a View Function
现在,让我们通过调用 View 函数来执行插入操作。在 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 列表注册此 View。
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 方法,则会分析表单数据并用于插入新记录。
The Model Form
Django 有一个 ModelForm 类,可以自动呈现 HTML 表单,其结构与模型类的属性相匹配。
我们在 app 文件夹中的 forms.py 文件中定义一个 DreamRealForm 类,它使用 Dreamreal model 作为基础。
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)
The CreateView Class
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 模型中插入数据的不同方法。