Django ModelForms

时间:2020-02-23 14:33:05  来源:igfitidea点击:

在本教程中,我们将在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