zoukankan      html  css  js  c++  java
  • model,form,ModelForm的比较

        model:     

    class Book(models.Model):
        nid = models.AutoField(primary_key=True)
        title = models.CharField( max_length=32,verbose_name="书名")
        publishDate=models.DateField(verbose_name="出版日期")
        price=models.DecimalField(max_digits=5,decimal_places=2,verbose_name="价格")
        gender=models.IntegerField(choices=((1:""),(2:"")))
        publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE,verbose_name="出版社")
        authors=models.ManyToManyField(to='Author',verbose_name="作者")

         form: 

    对于普通的字段,直接将model对象中models改成forms即可,但是对于ForeignKey和ManyToManyField字段不能直接改
    ChoiceField(Field)  #对应models中的choice
    ModelChoiceField(ChoiceField) #对应models中的ForeignKey
    queryset, # 查询数据库中的数据
    ModelMultipleChoiceField(ModelChoiceField) #对应models中的ManyToManyField
    from django import forms
    from app02.models import *
    class Book(forms.Form):
        title = forms.CharField( max_length=32,verbose_name="书名")
        publishDate=forms.DateField(verbose_name="出版日期")
        price=forms.DecimalField(max_digits=5,decimal_places=2,verbose_name="价格")
        #choice字段
        gender = forms.ChoiceField(choices=((1:""), (2: "")))
        对于publish和authors,也可以使用ChoiceField显示出来,只需要将表中的所有对象显示出来即可
        但是用此种方法,在数据库中添加新的数据,刷新页面后并不能显示出来,必须重新启动才可以,因此在form中多对多和一对多的关系不用ChoiceField
        publish=forms.ChoiceField(choices=Publish.objects.all().values_list("pk","name"))
        #使用ModelChoiceField和ModelMultipleChoiceField,只需把所有对象给queryset即可
        publish=models.ModelChoiceField(queryset=Publish.objects.all())
        authors=models.ModelMultipleChoiceField(queryset=Authors.objects.all())
    
    

        ModelForm    

    from django.forms import ModelForm
    class BookModelForm(ModelForm):
        class Meta:
            model=models.Book
            fields="__all__"
    对于ModelForm而言,ModelForm自动的将models中的choices,ForeignKey,ManyToManyField封装成了ChoiceField,ModelChoiceField,ModelMultipleChoiceField
    而使用form组件时,外键和对多对字段需要我们自己创建。
    form和ModelForm中并没有ForeignKey,ManyToManyField
    在ModelForm中查看字段的关系类型:
    for i in BookModelForm():  i为每个字段对象
    print(type(i)) #<class 'django.forms.boundfield.BoundField'>
    打印后所有的字段对象类型均为<class 'django.forms.boundfield.BoundField'>
    导入 from django.forms.boundfield import BoundField查看其源码:
    class BoundField(object):
        def __init__(self, form, field, name):
            self.form = form
            self.field = field  #字段的关系类型呢
            self.name = name    #字段名
            self.html_name = form.add_prefix(name)
    根据源码分析,字段类型有在field中,打印查看
    from django.forms.boundfield import BoundField
        for i in BookModelForm():
            print(type(i.field))
    <class 'django.forms.fields.DateField'>
    <class 'django.forms.fields.DecimalField'>
    <class 'django.forms.models.ModelChoiceField'>
    <class 'django.forms.models.ModelMultipleChoiceField'>

        常用操作    

    models中

    1.在model中根据表的类名取出app名和字符串类型的表名
    app_name=models.Book._meta.app_label
    model_name=models.Book._meta.model_name
    2.通过字符串类型的字段名找到相应字段对象
    obj = models.Book.model._meta.get_field("title")
    3.字段对象,找到其关联的表中的所有对象
    related_data=publish.rel.to.objects.all()

    ModelForm中

    1.查看字段的关系类型:type(i.field)
    2.查看字段名字:i.name str类型
    3.通过字段的关系类型,获得连接的表的类:
    print(.field.queryset.model) #<class 'app01.models.Publish'>
    4.获得该字段在页面上标签的id,自动匹配 i.auto_id ##id_publish
     
     
     
     
     
     
  • 相关阅读:
    winform控件库二次开发yy
    Oracle数据库表死锁和解锁
    集合去重筛选
    linux手动生成core dump
    HandlerSocket简介以及php使用handlersocket
    使用truss、strace或ltrace诊断软件的“疑难杂症”
    Sqlserver 2012 导出表数据为SQL脚本
    MySQL的索引为什么使用B+Tree
    计算机体系
    docker使用
  • 原文地址:https://www.cnblogs.com/zgf-666/p/9175305.html
Copyright © 2011-2022 走看看