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
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/zgf-666/p/9175305.html