社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

django2中表单的使用二

水痕001 • 6 年前 • 924 次点击  
阅读 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
 
924 次点击