Django之ModelForm(一)

要说ModelForm,那就先说Form吧!

先给出一个Form示例:

models.py
from django.db import models

class UserType(models.Model):
    caption=models.CharField(max_length=32)

class UserGroup(models.Model):
    name=models.CharField(max_length=32)

class UserInfo(models.Model):
    username=models.CharField(verbose_name="用户",max_length=32)
    email=models.EmailField()
    user_type=models.ForeignKey(to=‘UserType‘,to_field="id",on_delete=models.CASCADE)  #关联UserType  一对一
    u2g=models.ManyToManyField(UserGroup)  #关联UserGroup 多对多

views.py
from django.shortcuts import render
from django import  forms
from django.forms import fields
from app_01 import models

class UserInfoForm(forms.Form):
    username = fields.CharField(max_length=32)
    email = fields.EmailField()
    user_type = fields.ChoiceField(
        choices=models.UserType.objects.values_list("id","caption")  #在页面上 把用户类型作为列表列上来了
    )

    def __init__(self,*args,**kwargs):            #自动更新操作
        super(UserInfoForm,self).__init__(*args,**kwargs)
        self.fields[‘user_type‘].choices=models.UserType.objects.values_list("id","caption")

def index(request):
    if request.method=="GET":
        obj=UserInfoForm()
        return render(request,"index.html",{‘obj‘:obj})

    elif request.method=="POST":
        obj=UserInfoForm(request.POST)
        if obj.is_valid() :
            obj.save()     #验证成功 把所有的正确信息保存在数据库中

        return render(request,‘index.html‘,{‘obj‘:obj})

index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/index/" method="post">
        {{ obj.as_p}}
        {% csrf_token %}
        <input type="submit" value="提交" />
    </form>

</body>
</html>

在html上显示的效果为:

看了上面的示例,觉不觉得特麻烦?那让我们现在用ModelForm来实现吧!

其他不用改,只改views.py文件

from django.shortcuts import render
from django import  forms
from django.forms import fields
from app_01 import models

class UserInfoModelForm(forms.ModelForm):

    class Meta:
        model=models.UserInfo
        fields="__all__"   #代指所有的字段
    # models.UserInfo.objects.create(**obj.cleaned_data)   #在数据库中自动进行创建    # models.UserInfo.objects.filter(id=1).update(**obj.cleaned_data)  #在数据库中自动进行更新

def index(request):
    if request.method=="GET":
        obj=UserInfoModelForm()
        return render(request,"index.html",{‘obj‘:obj})

    elif request.method=="POST":
        obj=UserInfoModelForm(request.POST)
        if obj.is_valid() :
            obj.save()     #验证成功 把所有的正确信息保存在数据库中

        return render(request,‘index.html‘,{‘obj‘:obj})

可以看到Form和ModelForm的区别了吧!

但是ModelForm也有弊端的,只能用它写小一点的程序,而大程序利用这个则不适用!

利用ModelForm来实践下吧!

Models.py
from django.db import models

class UserType(models.Model):
    caption=models.CharField(max_length=32)

class UserGroup(models.Model):
    name=models.CharField(max_length=32)

class UserInfo(models.Model):
    username=models.CharField(verbose_name="用户",max_length=32)
    email=models.EmailField()
    user_type=models.ForeignKey(to=‘UserType‘,to_field="id",on_delete=models.CASCADE)
    u2g=models.ManyToManyField(UserGroup)

Views.py
def user_list(request):
    li=models.UserInfo.objects.all().select_related(‘user_type‘) #可以拿到UserInfo表内的数据,也可以拿到UserType表内的数据
    return render(request,‘user_list.html‘,{‘li‘:li})

def user_edit(request,nid):
    if request.method=="GET":
        user_obj=models.UserInfo.objects.filter(id=nid).first()
        mf=UserInfoModelForm(instance=user_obj)  #这里不能瞎传 必须得有参数 instance   若无instance 则是在数据库内创建了一条数据,而不是直接对数据进行更改
        return render(request,‘user_edit.html‘,{‘mf‘:mf ,‘nid‘:nid})
    elif request.method=="POST":
        user_obj = models.UserInfo.objects.filter(id=nid).first()
        mf = UserInfoModelForm(request.POST,instance=user_obj)
        if mf.is_valid():    #正确信息全部拿到
            mf.save()        #保存至数据库里
        else:
            print(mf.errors.as_json())
            return render(request, ‘user_edit.html‘, {‘mf‘: mf, ‘nid‘: nid})

user_list.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <ul>
        {% for row in li %}
            <li>{{ row.username }}-{{ row.user_type.caption }}-<a href="/edit-{{ row.id }}/">编辑</a> </li>
        {% endfor %}
    </ul>
</body>
</html>

user_edit.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/edit-{{ nid }}/" method="post">
        {% csrf_token %}
        {{ mf.as_p }}
        <input type="submit" value="提交" />
    </form>
</body>
</html>

urls.py
from django.contrib import admin
from django.urls import path
from app_01 import views
from django.conf.urls import url
import re
urlpatterns = [
    path(‘admin/‘, admin.site.urls),
    path(‘index/‘, views.index),
    path(‘user_list/‘, views.user_list),
    url(r‘^edit-(\d+)/‘, views.user_edit)  #正则表达式
]

user_list上的操作效果为:

user_erit上的操作效果为

原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/9129345.html

时间: 2024-10-24 04:21:09

Django之ModelForm(一)的相关文章

Django之ModelForm组件

1.Django之ModelForm组件 ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信息 help_texts=None, # 帮助提示信息 widgets=None, # 自定义插件 error_messages=None, # 自定义错误信息(整体错误信息from django.core.exceptions import NON_FIE

Django(十四)课程机构列表页数据展示,Django的modelform,关于urls的重新分发

关于urls的重新分发: 如果所有url都配置在根路径的urls.py里,会特别多,而且也不易于修改,Django框架里支持urls的重新分发: 1.在根路径的urls配置上: PS:namespace是定义命名空间,比如下面这种配置, urlpatterns = [ #课程机构url配置,验证码,每个app可以书写自己的url,然后通过include进来 url(r'^org/', include('oraganization.urls',namespace="org")), ] 2

Django的ModelForm简单用法

Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分别定义Form类和Model类会比较麻烦,最简单的方式就是通过Model来生成一个Form类,Django内置的ModelForm就是为此而生的.下面以一个简单的例子来说明它的简单用法. 基本需求 收集用户的日本报名信息 其中JLPT的日语等级分为N1,N2,N3,N4,N5:所以需要一个选择器. 用户需要手动输入姓名,因此需要一个输入框. 在Project中新建一个app $ python

Django的ModelForm

基于django.forms.ModelForm:与模型类绑定的Form 先定义一个ModelForm类,继承ModelForm类 from django.forms import ModelForm class MyModelForm(ModelForm): class Meta: model=models.UserInfo fields="__all__" 修改视图函数reg def reg(request): if request.method=="POST"

Django之modelform

在django中内置了form类和model类,当页面中的form值和model字段值完全一样时,此时可以通过model生成一个完全一样的form,Django中的modelForm就因此而生. 目标: 定义Author表,通过modelform提交数据到数据库 创建工程及app python django-admin.py startproject formstudy cd formstudy python manager.py startapp study 编辑models.py from

Django的ModelForm组件

创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import models class 类名(ModelForm): class Meta: model = models.表名 #models中的表名 fields="__all__", # 字段 exclude=None, # 排除字段 widgets=None, # 自定义插件 error_message

[django]django的modelform处理数据

django的form处理数据 1.生成html 2.验证数据合法性 3.直接存库 定义1个form class BlogPost(models.Model): title = models.CharField(max_length=150) body = models.TextField() timestamp = models.DateTimeField() 以前是这样的 class BlogPostForm(forms.Form): title = forms.CharField(max_

Django组件-ModelForm

模型表单ModelForm 一.基本用法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 from django import f

Django之ModelForm使用

一:什么是ModelForm呢? Model + Form ==> ModelForm.model和form的结合体,所以有以下功能: 数据验证 数据库操作 model有操作数据库的字段,form验证也有那几个字段,虽然耦合度降低,但是代码是有重复的.如果利用model里的字段,那是不是form里的字段就不用写了. 二:下面是一个简单是例子: from django.db import models class CustomerInfo(models.Model): ""&quo