Django之model.form创建select标签

前言

之前我们学习了form表单验证用户输入格式和自动创建HTML,那么如果用户创建select标签时怎么办呢,先来看下这个东西:

models.py 数据格式:

class UserInfo(models.Model):
    caption=models.CharField(max_length=16)

class UserType(models.Model):
    username=models.CharField(max_length=32)
    pwd=models.IntegerField
    user_type=models.ForeignKey('UserInfo')

views.py:

from django.shortcuts import render, HttpResponse
from s19 import models
from django import forms

# Create your views here.

class IndexForm(forms.Form):

    c = [
    	(1,'ceo'),
    	(2,'coo'),
    ]
    user_info_id = forms.IntegerField(widget=forms.Select(choices=c))

def index(request):
		#创建模拟用户
    # for i in range(10):
    #     models.UserInfo.objects.create(caption='CE'+str(i))
    form = IndexForm()
    return render(request,'index.html',{'form':form})

html文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>index</h1>
    {{ form.user_info_id }}
</body>
</html>

如果这么写,我们可以看到页面上有select标签实现,但这种方式是在内存里,如果在数据库中我们怎么来实现呢?

数据库提取,通过form实现HTML页面

首先要直到value_list,models中使用会将对象提取为元组模式,我们可以将对象中的id,caption 提取出来.

from django.shortcuts import render, HttpResponse
from s19 import models
from django import forms

# Create your views here.

class IndexForm(forms.Form):

    def __init__(self,*args,**kwargs):
        super(IndexForm,self).__init__(*args,**kwargs)
        self.fields['user_info_id'].widget.choices = models.UserInfo.objects.all().values_list('id','caption')
    c = models.UserInfo.objects.all().values_list('id','caption')
    user_info_id = forms.IntegerField(widget=forms.Select(choices=c))

def index(request):
    # for i in range(10):
    #     models.UserInfo.objects.create(caption='CE'+str(i))
    form = IndexForm()
    return render(request,'index.html',{'form':form})

需要注意一点:在上述代码中我们在类中添加了一条构造方法,使用父类的构造方法,将静态字段重新赋值,为什么呢?因为在在IndexForm的类中,我们取值是通过静态字段取值的,django运行一次以后,将静态字段的值保存在了内存中,而不是保存在数据库中,为了能实时提取数据,我们要使用构造方法在每次创建对象时对静态字段重新赋值!

原文地址:https://www.cnblogs.com/ccorz/p/5889542.html