django - 将表单值保存到数据库的不同方法
问题描述
我最近开始使用 Udemy 课程学习 Django。在完成课程时,讲师要求将表单中的值保存到数据库中。在互联网上搜索后,我想出了如何将表单值放入数据库并且一切正常。下面是我的views.py
和forms.py
文件。
表格.py
class FormName(forms.Form):
fname = forms.CharField( label="First Name")
lname = forms.CharField(label="Last name:")
email = forms.EmailField()
verify_email = forms.EmailField(label='Verify Email:')
def clean(self):
all_clean_data = super().clean()
email = all_clean_data['email']
vmail = all_clean_data['verify_email']
if email != vmail:
raise forms.ValidationError("Check the emails")
视图.py
def signup(request):
form = forms.FormName()
if request.method == 'POST':
form = forms.FormName(request.POST)
if form.is_valid():
post = User()
post.fname=request.POST.get('fname')
post.lname=request.POST.get('lname')
post.email=request.POST.get('email')
post.save()
return render(request,'third_app/greet.html')
else:
return render(request,'third_app/oops.html',{'form':form})
return render(request, 'third_app/signup.html',{'form':form})
现在提出问题,讲师正在使用Meta
类将表单值存储到数据库中。下面是他的forms.py
和views.py
文件。我很好奇我的方法和导师的方法有什么区别。
表格.py
class FormName(forms.ModelForm):
class Meta():
model = User
fields = 'all'
视图.py
def signup(request):
form = forms.FormName()
if request.method == 'POST':
form = forms.FormName(request.POST)
if form.is_valid():
form.save(commit=True)
return render(request,'third_app/greet.html')
else:
return render(request,'third_app/oops.html',{'form':form})
return render(request, 'third_app/signup.html',{'form':form})
谢谢。
解决方案
Django文档很好地解释了这一点。这就是所谓的ModelForm
:
如果您正在构建一个数据库驱动的应用程序,那么您很可能拥有与 Django 模型紧密映射的表单。例如,您可能有一个 BlogComment 模型,并且您想创建一个允许人们提交评论的表单。在这种情况下,在表单中定义字段类型是多余的,因为您已经在模型中定义了字段。出于这个原因,Django 提供了一个帮助类,让您可以从 Django 模型创建一个 Form 类。
因此,为了回答您的问题,您的方法使用常规表单 ( forms.Form
),您可以在其中定义表单字段、执行验证,然后将每个字段单独保存在您的视图中。使用时form.ModelForm
,会为您处理字段验证和保存。看到你已经定义了你的字段是什么,ModelForm
使用它来执行验证。该save()
方法方便地将每个字段保存到数据库中。
推荐阅读
- java - JUnit 单击键盘上的搜索按钮
- javascript - 如何将流从 php 链接传递到 clappr 播放器?
- electron - electron-builder - 如何在没有管理员权限的情况下写入/覆盖“app.asar.unpacked”文件夹中的文件
- python - python Dataframe subString 一列(长字符串)
- java - CameraX 和 OpenGL 在实时相机上应用效果
- javascript - 收音机更改音频值 onClick
- macos - 如何签署 shell 脚本以在 Mac OSX 上运行?
- sentry - Cloudflare Workers 的性能日志记录
- networking - IP 地址信息如何从 TCP 层传播到 IP 层?
- flutter - Flutter:FlutterWindowManager.FLAG_SECURE 在 ios 上不起作用