zoukankan      html  css  js  c++  java
  • 二十三. Django ModelForm组件

    一.  Django ModelForm组件

    https://download.csdn.net/download/baobao267/10722491   Django之Form表单验证及Ajax验证方式汇总

    https://www.jianshu.com/p/1c65fa4a6ca7  ModelForm和form区别使用

    https://blog.csdn.net/weixin_34179762/article/details/93371564    ModelForm操作及验证

    首先导入ModelForm
    
    from django.forms import ModelForm
    在视图函数中,定义一个类,比如就叫StudentList,这个类要继承ModelForm,在这个类中再写一个原类Meta(规定写法,并注意首字母是大写的)
    
    在这个原类中,有以下属性(部分)
    class StudentList(ModelForm):
        class Meta:
            model = models.Student  #对应的Model中的类
            fields = "__all__"      #字段,如果是__all__,就是表示列出所有的字段
            exclude = None          #排除的字段
            labels = None           #提示信息
            help_texts = None       #帮助提示信息
            widgets = None          #自定义插件
            error_messages = None   #自定义错误信息
    #error_messages用法:
            error_messages = {
                'name':{'required':"用户名不能为空",},
                'age':{'required':"年龄不能为空",},
            }
    
    #widgets用法,比如把输入用户名的input框给为Textarea
    #首先得导入模块
            from django.forms import widgets as wid  #因为重名,所以起个别名
            widgets = {
                "name":wid.Textarea(attrs={"class":"c1"}) #还可以自定义属性
            }
    #labels,自定义在前端显示的名字
    
        labels= {
                "name":"用户名"
            }

    二. ModelForm使用案例

    https://www.cnblogs.com/hnlmy/p/9526720.html   案例

    model
    
    from django.db import models
    
    # Create your models here.
    
    class Book(models.Model):
    
        title=models.CharField(max_length=32)
        price=models.DecimalField(max_digits=8,decimal_places=2)  # 999999.99
        date=models.DateField()
        publish=models.ForeignKey("Publish",on_delete=models.CASCADE)
        authors=models.ManyToManyField("Author")
        def __str__(self):
            return self.title
    
    
    
    class Publish(models.Model):
        name=models.CharField(max_length=32)
        def __str__(self):
            return self.name
    
    class Author(models.Model):
        name=models.CharField(max_length=32)
        def __str__(self):
            return self.name
    views
    
    from django.shortcuts import render,redirect
    # Create your views here.
    
    from .models import *
    from django import forms
    from django.forms import widgets
    
    from django.forms import ModelForm
    
    '''
    class BookForm(forms.Form):
    
            email=forms.EmailField()
            title = forms.CharField(max_length=32,label="书籍名称")
            price = forms.DecimalField(max_digits=8, decimal_places=2,label="价格")  # 999999.99
            date = forms.DateField(label="日期",
                widget=widgets.TextInput(attrs={"type":"date"})
            )
            #gender=forms.ChoiceField(choices=((1,"男"),(2,"女"),(3,"其他")))
            #publish=forms.ChoiceField(choices=Publish.objects.all().values_list("pk","title"))
            publish=forms.ModelChoiceField(queryset=Publish.objects.all())
            authors=forms.ModelMultipleChoiceField(queryset=Author.objects.all())
    '''
    
    from django.forms import widgets as wid
    class BookForm(ModelForm):
    
        class Meta:
            model=Book
            fields="__all__"    # 对Book表中所有字段转换渲染到页面上
            # fields = ["title","price"]   # 对Book表中title price字段转换渲染到页面上
    
            labels={"title":"书籍名称:", "price":"价格:"}
    
            widgets={
                "title":wid.TextInput(attrs={"class":"form-control"}),
                "price":wid.TextInput(attrs={"class":"form-control"}),
                "date":wid.TextInput(attrs={"class":"form-control","type":"date"}),
                "publish":wid.Select(attrs={"class":"form-control"}),
                "authors":wid.SelectMultiple(attrs={"class":"form-control"}),
            }
            error_messages={
                "title":{"required":"不能为空"}
            }
    
    
    def books(request):
        book_list=Book.objects.all()
        return render(request,"books.html",locals())
    
    def addbook(request):
        if request.method=="POST":
            form = BookForm(request.POST)
            if form.is_valid():
                form.save()    # form.model.objects.create(request.POST)    保存添加的数据到mysql中
                return redirect("/books/")
            else:
                return render(request, "add.html", locals())
        form=BookForm()
        return render(request,"add.html",locals())
    
    
    
    
    def editbook(request,edit_book_id):
        edit_book = Book.objects.filter(pk=edit_book_id).first()
        if request.method=="POST":
            form = BookForm(request.POST,instance=edit_book)   # 意思想要编辑的对象
            if form.is_valid():
                form.save()  # edit_book.update(request.POST)  编辑编辑跟新
                return redirect("/books/")
        form=BookForm(instance=edit_book)
        return render(request,"edit.html",locals())
    templates
    form.html
    
    <form action="" method="post" novalidate>
          {% csrf_token %}
          {% for field in form %}
            <div>
             {{ field.label }}
             {{ field }} <span>{{ field.errors.0 }}</span>
            </div>
          {% endfor %}
        <input type="submit">
    </form>
    books.html
    
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
    <a href="/book/add"><button>添加书籍</button></a>
    <hr>
    <table border="1">
        {% for book in book_list %}
           <tr>
               <td>{{ book.title }}</td>
               <td>{{ book.price }}</td>
               <td>{{ book.date|date:"Y-m-d" }}</td>
               <td>{{ book.publish.name }}</td>
               <td>{{ book.authors.all }}</td>
                <td><a href="/book/edit/{{book.pk}}"><button>编辑</button></a></td>
           </tr>
        {% endfor %}
    
    </table>
    
    
    </body>
    </html>
    add.html
    
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    </head>
    <body>
    
    <h3>添加页面</h3>
    <div class="row">
        <div class="col-md-4 col-md-offset-3">
            {% include 'form.html' %}
        </div>
    </div>
    
    </body>
    </html>
    edit.html
    
    
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
    </head>
    <body>
    
    <h3>编辑页面</h3>
    
    {% include 'form.html' %}
    </body>
    </html>

      

  • 相关阅读:
    vip视频播放
    一行Python代码画心型
    使用赫夫曼编码压缩数据
    动态规划与贪婪算法学习笔记
    boost 编写finger服务
    磁盘保护原理简介
    知乎上的一道题目 如何判断某个二进制数如是否存在两位1中间有包含0的情况?
    <Linux多线程服务端编程>学习记录
    Debian8 下面 muduo库编译与使用
    无盘工作站原理分析
  • 原文地址:https://www.cnblogs.com/lovershowtime/p/11568040.html
Copyright © 2011-2022 走看看