Py学习  »  Django

django2中表单的使用二

水痕001 • 5 年前 • 490 次点击  
阅读 1

django2中表单的使用二

前一章节介绍了django中的表单,本章节继续介绍表单,但是本章节是基于数据模型来使用的表单,因为我们也称之为模型表单

一、使用模型表单的主要步骤

  • 1、定义数据模型

    from django.db import models
    from django.core import validators
    
    
    class ArticleModel(models.Model):
        """
        定义文章的数据模型
        """
        title = models.CharField(max_length=10, validators=[validators.MinValueValidator(limit_value=3)], verbose_name='标题')
        content = models.TextField(verbose_name='内容')
        author = models.CharField(max_length=10, verbose_name='作者')
        category = models.CharField(max_length=10, verbose_name='分类')
        create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
        update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
    
        class Meta(object):
            db_table = 'article'
    复制代码
  • 2、在app下面创建一个forms.py的文件

  • 3、在forms.py文件中使用模型表单

    from django import forms
    from . import models
    
    
    class ArticleForms(forms.ModelForm):
        """
        文章的form模型
        """
    
        class Meta(object):
            model = models.ArticleModel
            fields = '__all__'
    复制代码
  • 4、视图中使用

    from django.shortcuts import render
    from django.views import View
    from django.http import HttpResponse
    from . import forms
    from . import models
    
    
    class ArticleView(View):
        """
        文章视图
        """
    
        def get(self, request, *args, **kwargs):
            form = forms.ArticleForms()
            return render(request, 'article.html', context={'form': form})
    
        def post(self, request, *args, **kwargs):
            form = forms.ArticleForms(request.POST)
            if form.is_valid():
                print('表单校验成功')
                title = form.cleaned_data.get('title')
                content = form.cleaned_data.get('content')
                author = form.cleaned_data.get('author')
                category = form.cleaned_data.get('category')
                print(title, content, author, category)
                return HttpResponse('成功')
            else:
                print('表单校验失败')
                print(form.get_errors())
                return HttpResponse('失败')
    复制代码
  • 5、前端html页面

    <form action="/book/" method="post">
        {% csrf_token %}
        <table>
            {{ form.as_table }}
            <tr>
                <td></td>
                <td>
                    <input type="submit" value="提交">
                </td>
            </tr>
        </table>
    </form>
    复制代码

二、关于模型表单别的知识点的补充

  • 1、如果要使用全部的字段就在fields中使用__all__

    class ArticleForms(forms.ModelForm):
        """
        文章的form模型
        """
    
        class Meta(object):
            model = models.ArticleModel
            fields = '__all__'
    复制代码
  • 2、如果是需要显示某些字段的时候

    class ArticleForms(forms.ModelForm):
        """
        文章的form模型
        """
    
        class Meta(object):
            model = models.ArticleModel
            fields = ['title', 'content']
    复制代码
  • 3、如果模型中字段比较多使用排除的方法

    class ArticleForms(forms.ModelForm):
        """
        文章的form模型
        """
    
        class Meta(object):
            model = models.ArticleModel
            # fields = ['title', 'content']
            exclude = ['title']
    复制代码

三、关于错误信息的处理

之前是写在每一个字段上,现在没字段可写了

  • 1、直接在forms.py中定义

    class ArticleForms(forms.ModelForm):
        """
        文章的form模型
        """
    
        class Meta(object)
    
    
        
    :
            model = models.ArticleModel
            fields = '__all__'
    
            error_messages = {
                'title': {
                    'max_length': 'title字段不能超过10字符',
                    'required': '请输入标题',
                    'invalid': '请输入一个有效的标题'
                }
            }
    复制代码
  • 2、可以在models中给某一个字段添加

    from django.core import validators
    class ArticleModel(models.Model):
        """
        定义文章的数据模型
        """
        title = models.CharField(max_length=10, validators=[validators.MinValueValidator(limit_value=3)], verbose_name='标题')   
    复制代码
  • 3、在forms.py中定义一个方法

    class ArticleForms(forms.ModelForm):
        """
        文章的form模型
        """
    
        class Meta(object):
            model = models.ArticleModel
            fields = '__all__'
            
        def clean_price(self):
            """
            自定义价格的校验
            :return: 
            """
            price = self.cleaned_data.get('price')
            if price < 0:
                raise forms.ValidationError('价格不能不能小于0元')
            return price
    复制代码

四、关于表单中save的方法

  • 1、直接使用save保存数据

    class ArticleView(View):
        """
        文章视图
        """
    
        def get(self, request, *args, **kwargs):
            form = forms.ArticleForms()
            return render(request, 'article.html', context={'form': form})
    
        def post(self, request, *args, **kwargs):
            form = forms.ArticleForms(request.POST)
            if form.is_valid():
                print('表单校验成功')
                form.save()
                return HttpResponse('成功')
            else:
                print('表单校验失败')
                print(form.get_errors())
                return HttpResponse('失败')
    复制代码
  • 2、当遇到模型中字段与表单中字段不一致的时候

    # 模型字段
    class UserModel(models.Model):
        username = models.CharField(max_length=100, verbose_name='用户名')
        password = models.CharField(max_length=100, verbose_name='密码')
    
        class Meta(object):
            db_table = 'c_user'
    复制代码
    # 表单校验的
    class RegisterForm(forms.ModelForm):
        pwd1 = forms.CharField(max_length=100, min_length=2)
        pwd2 = forms.CharField(max_length=100, min_length=2)
    
        def clean(self):
            cleaned_data = super().clean()
            pwd1 = cleaned_data.get('pwd1')
            pwd2 = cleaned_data.get('pwd2')
    
            if pwd1 !=pwd2:
                raise forms.ValidationError('两次密码不一致')
            return cleaned_data
    
        class Meta(object):
            model = models.UserModel
            exclude = ['password']
    复制代码
    # 视图中使用
    class RegisterView(View):
        """
        用户注册
        """
    
        def get(self, request, *args, **kwargs):
            form = forms.RegisterForm()
            return render(request, 'register.html', context={'form': form})
    
        def post(self, request, *args, **kwargs):
            form = forms.RegisterForm(request.POST)
            if form.is_valid():
                user = form.save(commit=False)
                user.password = form.cleaned_data.get('pwd1')
                user.save()
                return HttpResponse('成功')
            else:
                print(form.get_errors())
                return HttpResponse('失败')
    复制代码
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31895
 
490 次点击