Django ModelForms
在本教程中,我们将在Django Web应用程序中讨论和实现ModelForms。
在继续进行之前,请先整理一下Django模型和Django表单。
Django ModelForms
我们可以将它们映射到特定的模型,而不是为Django表单冗余地创建单个字段。
这称为ModelForms。
ModelForm是可以使用以下命令导入的类:
from django.forms import ModelForm
以下是使用ModelForms的好处:
当我们要从数据库字段创建表单时,ModelForm非常有用。
我们可以在数据库模型字段中添加我们自己的验证检查器。
我们可以根据自己的选择在模型中包括和排除字段。
易于快速将表单数据保存到数据库。
ModelForm与Form ModelForm从指定的模型类获取其字段定义。
它还具有帮助程序方法,可将表单保存到数据库。
这些功能不在窗体中。
在Django ModelForm实例上调用save()save方法,以将数据保存到数据库(SQLite3)。
调用save将运行验证检查。
如果表单中的数据未通过验证,则会引发" ValueError"。
save()方法还接受可选的参数commit。
将commit设置为false不会将数据保存到数据库。
创建ModelForm类
要创建ModelForm类,我们需要其中添加一个类Meta。
在Meta类内部,我们实例化Django Model类。
我们必须包括/排除我们要在模型中使用的字段。
为了包括" fields",我们将它们设置在Python数组中。
如果要包括所有字段,请设置fields ='__all __'。
要"排除"字段,请将它们设置在各自的数组内。
下面给出了我们的Model类和ModelForm类的示例:
from django.db import models
from django.forms import ModelForm
class SampleModel(models.Model):
title = models.CharField(max_length=100)
description = models.CharField(max_length=255)
def __str__(self):
return self.title
class SampleModelForm(ModelForm):
class Meta:
model = SampleModel
fields = ['title']
在上面的代码中,我们的SampleModelForm省略了字段描述。
在我们的Django Web应用程序中显示ModelForm与我们在Django Forms教程中显示的方法非常相似。
要将ModelForm保存到数据库,我们执行以下操作:
data = SampleModel(title='Me') form = SampleModelForm(request.POST, instance=data) form.save()
当我们希望随身保存更改后的数据版本而不保存时,通常使用save(commit = False)。
通常用于测试目的。
为此,我们可以这样做:
form = SampleModelForm(request.POST) model = form.save(commit=False) model.title = 'Anupam testing' model.save()
为了使用commit False,我们必须包含以下import语句。
从django.forms导入modelformset_factory
在以下部分中,我们将构建一个简单的Django ModelForms网络应用程序。
项目结构
注意:display0.html包含display.html的备份。
要设置上述项目,请在终端中一个接一个地运行以下命令集。
mkdir DjangoModelForm cd DjangoModelForm virtualenv -p /usr/local/bin/python3 env source env/bin/activate pip3 install django django-admin startproject ModelFormProject cd ModelFormProject python3 manage.py runserver django-admin startapp detailsapp cd detailsapp mkdir templates cd templates touch userdetails.html touch display.html cd .. touch urls.py touch forms.py
我们的Django应用的名称为detailsapp。
将其添加到settings.pyINSTALLED_APPS列表中。
userdetails.html是我们应用程序的首页。
代码
detailsapp文件夹中的" urls.py"文件的代码为:
from django.urls import path
from django.contrib import admin
from detailsapp import views as detailsapp_views
urlpatterns = [
path('userdetails/', detailsapp_views.userDetails),
path('display/', detailsapp_views.userDetails),
path('', admin.site.urls),
]
ModelFormProject文件夹中的" urls.py"文件的代码为:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('detailsapp.urls'))
]
models.py
from django.db import models
class UserDetails(models.Model):
title = models.CharField(max_length=100)
gender = models.CharField(max_length=255)
notes = models.CharField(max_length=255)
def __str__(self):
return self.title
forms.py
from django.forms import ModelForm
from detailsapp.models import UserDetails
class UserModelForm(ModelForm):
class Meta:
model = UserDetails
fields = ['title', 'notes']
views.py
from django.shortcuts import render
from django.db import models
from detailsapp.models import UserDetails
from django.template import loader
from django.http import HttpResponse
from django.forms import modelformset_factory
# Create your views here.
from .forms import UserModelForm
def userDetails(request):
if request.method == 'POST':
form = UserModelForm(request.POST)
if form.is_valid():
u = form.save()
users = UserDetails.objects.all()
return render(request, 'display.html', {'users': users})
else:
form_class = UserModelForm
return render(request, 'userdetails.html', {
'form': form_class,
})
表单为空时,将执行else语句,并将其用于在userdetails.html文件中创建表单:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django Forms Tutorial</title>
</head>
<body>
<h2>Django Forms Tutorial</h2>
<form action="/display/" method="post">
{% csrf_token %}
<table>
{{form.as_table}}
</table>
<input type="submit" value="Submit"
</form>
</body>
</html>
" users = UserDetails.objects.all()"用于从数据库中检索所有条目,并将其传递给" display.html"文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>ModelForm Tutorial</title>
</head>
<body>
<h2>All User Details</h2>
<table>
{% for item in users %}
<tr>
<td>Title:{{ item.title }}</td>
<td>Gender: {{ item.gender|default:"NA" }}</td>
<td>Notes: {{ item.notes }}</td>
</tr>
<tr>
<td colspan="2" class="divider"><hr</td>
</tr>
{% endfor %}
</table>
</body>
</html>
由于不包括性别字段,因此我们使用Django模板为其设置了默认值。
要在您的本地主机上运行该应用程序,我们必须将模型保存在数据库中
python3 manage.py makemigrations python3 manage.py migrate python3 manage.py runserver
为了清除数据库,请运行以下命令:
python3 manage.py flush

