Form与ModelForm的补充

一、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确定的会转换成T
ypedChoiceField,一对多字段会转换成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}

 

posted @ 2018-02-08 10:25  星雨5213  阅读(113)  评论(0)    收藏  举报