• 注册
当前位置:1313e > 默认分类 >正文

Django之ModelForm(一)

要说ModelForm,那就先说Form吧!

先给出一个Form示例:

models.py
from django.db import modelsclass 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 modelsclass 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

"en">
"UTF-8">Title

"/index/" method="post">{{ obj.as_p}}{% csrf_token %}"submit" value="提交" />

在html上显示的效果为:

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

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

from django.shortcuts import render
from django import  forms
from django.forms import fields
from app_01 import modelsclass UserInfoModelForm(forms.ModelForm):class Meta:model=models.UserInfofields="__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 modelsclass 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

"en">
"UTF-8">Title



user_edit.html

"en">
"UTF-8">Title

"/edit-{{ nid }}/" method="post">{% csrf_token %}{{ mf.as_p }}"submit" value="提交" />
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

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录