专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

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('失败')

未经允许不得转载:搜云库技术团队 » django2中表单的使用二

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们