今天的Django教训汇总:建立表单、POST数据-20210331

本文精华总结在# 6.建立表单的标准流程

1.用Form类来新增表单。

  • forms.py
from django import forms

class NewEmployee(forms.Form):
    name = forms.CharField()
    email = forms.EmailField()
    message = forms.CharField()
In [2]: from myclass.forms import NewEmployee

In [4]: f = NewEmployee()

In [5]: print(f)
<tr><th><label for="id_name">Name:</label></th><td><input type="text" name="name" required id="id_name"></td></tr>
<tr><th><label for="id_email">Email:</label></th><td><input type="email" name="email" required id="id_email"></td></tr>
<tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" required id="id_message"></td></tr>

在这里插入图片描述

2.clean_data

最后,具有有效数据的表单实例有个 cleaned_data 属性,它的值是一个字典,存储着“清理后的”提交数据。
Django 的表单框架不仅验证数据,还会清理数据,把值转换成合适的 Python 类型:

>>> f = ContactForm({
    
    'subject': 'Hello', 'email': '[email protected]',
'message': 'Nice site!'})
>>> f.is_valid() True
>>> f.cleaned_data
{
    
    'message': 'Nice site!', 'email': '[email protected]', 'subject':
'Hello'}

这个联系表单只处理字符串,经“清理”后得到字符串对象。然而,如果使用 IntegerField 或 DateField,表单框架会确保清理后的数据使用正确的 Python 整数或 datetime.date 对象。

  • 我遇到的低级错误:clean_data是错误的,cleaned_data是正确的。
In [1]: from myclass.forms import NewEmployee

In [2]: f =  NewEmployee()

In [3]: f.is_valid()
Out[3]: False

In [4]: F2 = NewEmployee({
    
    'subject':'Hello','email':'[email protected]','message':'Nice Day'})

In [5]: F2.is_valid()
Out[5]: True

In [6]: F2.clean_data
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-79e6a75fb2a6> in <module>
----> 1 F2.clean_data

AttributeError: 'NewEmployee' object has no attribute 'clean_data'

In [13]: F2.cleaned_data
Out[13]: {
    
    'subject': 'Hello', 'email': '[email protected]', 'message': 'Nice Day'}

3. forms表单的数据,如果POST进数据库呢?

答案是forms表单的数据存进去model里面。
https://blog.csdn.net/qq_39620483/article/details/89453775?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

  • 参考以下代码进行模型建立
def register(request): # 注册视图函数
    if request.method == "POST" and request.POST: # 判断请求方式为post并且有内容
        register_form = RegisterForm(data=request.POST) # 满足条件则将输入内容传递给form对象
        if register_form.is_valid(): # 校验数据为True(会逐个字段校验,如调用clean方法),获取输入的数据
            username = register_form.cleaned_data["username"]
            password = register_form.cleaned_data["password"]
            nickname = register_form.cleaned_data["nickname"]
            phone = register_form.cleaned_data["phone"]
            email = register_form.cleaned_data["email"]
            # 表中添加数据
            UserInfo.objects.create(username=username,password=password,nickname=nickname,phone=phone,email=email)
            return HttpResponse("%s,%s,%s,%s,%s"%(username,password,nickname,phone,email)) # 数据有效,页面返回输入值
    else:
        register_form = RegisterForm()  # GET请求时,不传入内容,直接实例化一个form表单(就跟直接访问注册地址效果一样)
    return render(request, "register.html", locals()) # 访问url,对应视图函数,对应显示前端页面
  • 修改views.py代码如下,再运作还是发生错误,原因是修改了models没有python manage.py makemigrations 和 python manage.py migrate。
# 建立表单页
def NewEmployee_form(request):
    if request.method == 'POST' and request.POST:
        form = NewEmployee(data=request.POST)
        if form.is_valid():
            subject = form.cleaned_data['subject']
            email = form.cleaned_data['email']
            message = form.cleaned_data['message']
            # 表中添加数据
            NewEmployeeModel.objects.create(subject=subject,email=email,message=message)
            return HttpResponseRedirect('/admin/')
        else:
            form = NewEmployee()
    else:
        form = NewEmployee()
    return render(request, 'myclass/NewEmployee_form.html',context={
    
    'form':form})

在这里插入图片描述

  • python manage.py makemigrations 和 python manage.py migrate在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

4.复制forms记得去views中把实例化的forms改掉,否则出现的forms还是旧的那个。

  • 错误代码如下,请注意form = NewEmployee(data=request.POST)
# 建立表单页for employee
def Employee_form(request):
    if request.method == 'POST' and request.POST:
        form = NewEmployee(data=request.POST)
        if form.is_valid():
            eid = form.cleaned_data['subject']
            name = form.cleaned_data['email']
            dept_code = form.cleaned_data['message']
            gender = form.cleaned_data['message']
            on_board = form.cleaned_data['message']
            Range = form.cleaned_data['message']
            # 表中添加数据
            Employee.objects.create(eid=eid,name=name,dept_code=dept_code,gender=gender
                                    ,on_board=on_board,Range=Range)
            return HttpResponseRedirect('/admin/')
        else:
            form = NewEmployee()
    else:
        form = NewEmployee()
    return render(request, 'myclass/Employee_form.html',context={
    
    'form':form})

  • 旧的forms
    在这里插入图片描述
  • 修改代码如下,请注意form = EmployeeForm(data=request.POST)
def Employee_form(request):
    if request.method == 'POST' and request.POST:
        form = EmployeeForm(data=request.POST)
        if form.is_valid():
            eid = form.cleaned_data['eid']
            name = form.cleaned_data['name']
            dept_code = form.cleaned_data['dept_code']
            gender = form.cleaned_data['gender']
            on_board = form.cleaned_data['on_board']
            Range = form.cleaned_data['Range']
            # 表中添加数据
            Employee.objects.create(eid=eid,name=name,dept_code=dept_code,gender=gender
                                    ,on_board=on_board,Range=Range)
            return HttpResponseRedirect('/admin/')
        else:
            form = EmployeeForm()
    else:
        form = EmployeeForm()
    return render(request, 'myclass/Employee_form.html',context={
    
    'form':form})
  • 新的forms
    在这里插入图片描述

  • 提交表格后,保存成功
    在这里插入图片描述

5.Form类可参考django官方文档

https://docs.djangoproject.com/zh-hans/3.1/topics/forms/
https://docs.djangoproject.com/zh-hans/3.1/topics/forms/modelforms/#modelform

6.建立表单的标准流程

  • 第一步:建立models.py的模型,形成与forms、views的对应关系。
    #models.py
class Employee(models.Model):
    eid = models.CharField(max_length=200,default='1')
    name = models.CharField(max_length=200,null=True)
    dept_code = models.CharField(max_length=200,null=True)
    GENDER_CHOICES = (
        (u'Male', u'Male'),
        (u'Female', u'Female'),
    )
    gender = models.CharField(max_length=200,choices=GENDER_CHOICES,null=True)
    on_board = models.BooleanField(null=True)
    Range_CHOICES = (
        (u'R1', u'R1'),
        (u'R2', u'R2'),
        (u'R3', u'R3'),
        (u'R4', u'R4'),
    )
    Range = models.CharField(max_length=200,choices=Range_CHOICES,null=True)

    def __str__(self):
        return self.name
  • 第两步:比照models的属性,建立forms。
    #修改forms.py
class EmployeeForm(forms.Form):
    eid = forms.CharField()
    name = forms.CharField()
    dept_code = forms.CharField()
    gender = forms.CharField()
    on_board = forms.BooleanField()
    Range = forms.CharField()
  • 第三步:通过views.py来建立models和form的关联。
    #views.py
# 建立表单页for employee
def Employee_form(request):
    if request.method == 'POST' and request.POST:
        form = EmployeeForm(data=request.POST)
        if form.is_valid():
            eid = form.cleaned_data['eid']
            name = form.cleaned_data['name']
            dept_code = form.cleaned_data['dept_code']
            gender = form.cleaned_data['gender']
            on_board = form.cleaned_data['on_board']
            Range = form.cleaned_data['Range']
            # 表中添加数据
            Employee.objects.create(eid=eid,name=name,dept_code=dept_code,gender=gender
                                    ,on_board=on_board,Range=Range)
            return HttpResponseRedirect('/admin/')
        else:
            form = EmployeeForm()
    else:
        form = EmployeeForm()
    return render(request, 'myclass/Employee_form.html',context={
    
    'form':form})
  • 第四步:修改urls,来映射views。
    #myclass/urls.py
urlpatterns = [
    path('Employee_form/',views.Employee_form,name='Employee_form'),
]
  • 第五步:填写表单,检查数据是否提交至admin。若有错误,则需重新检查第一步到第四步。
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_46629123/article/details/115336012