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