一、Form
#建表
from django.db import models
# Create your models here.
class UserInfor(models.Model):
user=models.CharField(max_length=32)
gender=models.IntegerField(choices=((1,"男"),(2,"女")))
city=models.ForeignKey("City",default=1)
roles=models.ManyToManyField("Roles",default=1)
class City(models.Model):
name=models.CharField(max_length=32)
population=models.IntegerField()
def __str__(self):
return self.name
class Roles(models.Model):
name=models.CharField(max_length=32)
def __str__(self):
return self.name
#在form中建立关系
from django.forms import ModelForm
from django import forms
from .models import *class RegForm(forms.Form):
user = forms.CharField(max_length=32)
#gender_tuple=(0,'上海'),(1,'北京'),(2,'保定')
gender = forms.ChoiceField(choices =City.objects.all().values_list("id","name"))
#这样建立,当在数据库中添加数据时,页面不会更新刚添加的数据,因为启动时只运行一次__init__方法,页面刷新时
拿到的还是之前的数据,怎么解决?
一种解决方法:
class RegForm(forms.Form):
user = forms.CharField(max_length=32)
#gender_tuple=(0,'上海'),(1,'北京'),(2,'保定')
gender = forms.ChoiceField(choices =City.objects.all().values_list("id","name"))
def __init__(self,*args,**kwargs):
super(RegForm,self).__init__(*args,**kwargs)
self.fields["gender"].choices=City.objects.all().values_list("id","name")
二、ModelForm
建表之后,只需写如下代码:
class RegForm(ModelForm):
class Meta:
model=UserInfor
fields="__all__"
这样就会自动转换成form,转换的form为:
class UserInfor(forms.Form):
user=forms.CharField()
gender=forms.TypedChoiceField(choices=((1,"男"),(2,"女")))
city=forms.ModelChoiceField(choices=City.objects.all())
roles=forms.ModelMultipleChoiceField(choices=Roles.objects.all())
也就是,choice确定的会转换成TypedChoiceField,一对多字段会转换成ModelChoiceField
多对多字段会转换成ModelMultipleChoiceField
TypedChoiceField(ChoiceField)、ModelChoiceField(TypedChoiceField)
ModelMultipleChoiceField(ModelChoiceField)
三、Form创建方式二
TempForm=type('TempForm',(Form,),{
'score_%s'%study_record.pk:fields.ChoiceField(choices=StudyRecord.score_choices),
'homework_note_%s'%study_record.pk:fields.CharField(widget=widgets.Textarea(attrs={"rows":2}))
})
实例化:
TempForm(initial={
'score_%s'%study_record.pk:study_record.score,
'homework_note_%s' % study_record.pk:study_record.homework_note}