zoukankan      html  css  js  c++  java
  • Django 四——ModelForm用法

    内容概要:

    1.新增数据库表中数据

    2.更新数据库表中数据


    Django的ModelForm

    Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分别定义Form类和Model类会比较麻烦,最简单的方式就是通过Model来生成一个Form类,Django内置的ModelForm就是为此而生的。

    ModelForm 是 Django 中编写基于 Model 定制表单的方法,可以提高 Model 复用性。

    使用时 Django 会根据 django.db.models.Field (用于数据库衔接) 自动转化为 django.forms.Field (用于表单前端展示、后端验证)。

    1.新增数据库表中数据

    views文件夹==》mf.py中

    '''
    ModelForm的功能介绍:
    1.获取所有或指定字段
    2.新增数据库表中数据
    3.更新数据库表中数据
    '''
    from django.shortcuts import render
    from django import forms
    from app01 import models
    
    class UModelForm(forms.ModelForm):
        class Meta:#定义元类,同时能将关联的数据全部拿到(ForeignKey)
            model = models.User #和models.py中的User表关联,注意写法:model,没有s!!!
            fields = '__all__' #取全部字段
    #新增数据方法,并且同步到数据库
    def index(request):
        if request.method =='GET':
            obj =UModelForm()
            return render(request,'mf.html',{'obj':obj})
        elif request.method =='POST':
            obj = UModelForm(request.POST)
            if obj.is_valid():
                print(obj.cleaned_data)
                # models.User.objects.create(**obj.cleaned_data)#新增数据方法,或者用obj.save()
                obj.save()
            return render(request, 'mf.html', {'obj':obj})

      mf.html中

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

    models.py中

    from django.db import models
    
    class UserType(models.Model):
        name = models.CharField(max_length=32)
        def __str__(self):
            return self.name
    
    class User(models.Model):
        name = models.CharField(max_length=32)
        email = models.EmailField(max_length=32)
        u_type = models.ForeignKey('UserType') #一对多
        m = models.ManyToManyField('M2M') #多对多
    
    class M2M(models.Model):
        name = models.CharField(max_length=32)
        def __str__(self):
            return self.name
    

      

    urls.py中

    from django.conf.urls import url
    from django.contrib import admin
    from app01.views import fm
    from app01.views import mf
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^fm/', fm.index),
        url(r'^aa/', fm.aa),
        url(r'^mf/', mf.index),
    ]
    

      2.更新数据库表中数据

     views文件夹==》mf.py中

    '''
    ModelForm的功能介绍:
    1.获取所有或指定字段
    2.新增数据库表中数据
    3.更新数据库表中数据
    '''
    from django.shortcuts import render
    from django import forms
    from app01 import models
    
    class UModelForm(forms.ModelForm):
        class Meta:#定义元类,同时能将关联的数据全部拿到(ForeignKey)
            model = models.User #和models.py中的User表关联,注意写法:model,没有s!!!
            fields = '__all__' #取全部字段
    
    #更新数据库中数据
    def edit_index(request,nid):
        if request.method =='GET':
            model_obj = models.User.objects.get(id=nid)
            obj =UModelForm(instance=model_obj) #带上现在的值
            return render(request,'mf1.html',{'obj':obj,'nid':nid})
        elif request.method == 'POST':
            model_obj = models.User.objects.get(id=nid)
    
            obj = UModelForm(request.POST,instance=model_obj) #这个地方也要加上instance
            if obj.is_valid():
                obj.save()
            return render(request, 'mf1.html', {'obj': obj})

    mf1.html中

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

      models.py中

    from django.db import models
    
    class UserType(models.Model):
        name = models.CharField(max_length=32)
        def __str__(self):
            return self.name
    
    class User(models.Model):
        name = models.CharField(max_length=32)
        email = models.EmailField(max_length=32)
        u_type = models.ForeignKey('UserType') #一对多
        m = models.ManyToManyField('M2M') #多对多
    
    class M2M(models.Model):
        name = models.CharField(max_length=32)
        def __str__(self):
            return self.name
    

      urls.py中

    from django.conf.urls import url
    from django.contrib import admin
    from app01.views import fm
    from app01.views import mf
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^fm/', fm.index),
        url(r'^aa/', fm.aa),
        url(r'^mf/', mf.index),
        url(r'^edit-mf-(d+)', mf.edit_index),
    ]
    

    补充:

    https://juejin.im/entry/58d54b2144d90400686847b6 

     

  • 相关阅读:
    jQuery图片切换插件jquery.cycle.js
    UVA
    FragmentPagerAdapter和FragmentStatePagerAdapter的差别
    更改jdk所用内存空间
    一次性能优化将filter转换
    JSP中文件的上传于下载演示样例
    Diskpart工具应用两则:MBR/GPT分区转换 &amp; 基本/动态磁盘转换
    LDD3之并发和竞态-completion(完毕量)的学习和验证
    二维码的扫描、生成
    输入一行字符,分别统计出包括英文字母、空格、数字和其他字符的个数
  • 原文地址:https://www.cnblogs.com/tangtingmary/p/8082999.html
Copyright © 2011-2022 走看看