首页 > 解决方案 > 将表单值保存到数据库的不同方法

问题描述

我最近开始使用 Udemy 课程学习 Django。在完成课程时,讲师要求将表单中的值保存到数据库中。在互联网上搜索后,我想出了如何将表单值放入数据库并且一切正常。下面是我的views.pyforms.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.pyviews.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})

谢谢。

标签: djangopython-3.xdjango-formsdjango-views

解决方案


Django文档很好地解释了这一点。这就是所谓的ModelForm

如果您正在构建一个数据库驱动的应用程序,那么您很可能拥有与 Django 模型紧密映射的表单。例如,您可能有一个 BlogComment 模型,并且您想创建一个允许人们提交评论的表单。在这种情况下,在表单中定义字段类型是多余的,因为您已经在模型中定义了字段。出于这个原因,Django 提供了一个帮助类,让您可以从 Django 模型创建一个 Form 类。

因此,为了回答您的问题,您的方法使用常规表单 ( forms.Form),您可以在其中定义表单字段、执行验证,然后将每个字段单独保存在您的视图中。使用时form.ModelForm,会为您处理字段验证和保存。看到你已经定义了你的字段是什么,ModelForm使用它来执行验证。该save()方法方便地将每个字段保存到数据库中。


推荐阅读