Django 表单 (中)-动态实现select效果

在Django里面,看看如何通过form来实现一个动态地select下拉框的效果。


首先看看静态的select的效果

models.py

class city(models.Model):
    name=models.CharField(max_length=32)
    #确保admin里面显示的是名字而不是object
    def __str__(self):
        return self.name

admin.py

from django.contrib import admin
from app01.models import city
admin.site.register(city)

然后在admin里面随便添加几条数据

views.py

######################## Form #####################
from django import forms
from django.forms import widgets
from django.forms import fields
from app01 import models
from django.forms import ModelChoiceField
class FM(forms.Form):
#这里使用value_list是因为传递给choices的格式刚好是一个列表包括的元组格式
    city3=fields.ChoiceField(
        choices=models.city.objects.all().values_list(‘id‘, ‘name‘),
        widget=widgets.Select
      
    )
    
def fm(request):
    if request.method == "GET":
        obj=FM()
        return render(request,‘fm.html‘,{‘obj‘: obj})

效果如下

这个时候,如果我在后台对city这个表进行了修改,刷新我的页面,显示的效果是不会改变的!只有当我重启整个Django,对应的数据才会在前台进行改变。

这是为什么呢?很简单,看看我们在class FM里面的定义,city3是这个类的静态字段,换句话说,这个字段在编译这个类的时候就初始化了,而当我们刷新页面,实例化对象的时候,这个静态字段的值并不会因为实例的不同而改变。那么为了改变对应的字段,解决方案就很明显了,要么在实例化以后的对象重新赋值,要么在实例化的过程中复制。这里我选择在实例化的过程中赋值,只需要自己重写一下init构造函数就行了。

修改代码:

注意super的使用,继承父类的init方法,然后再执行自己的赋值语句

city3=fields.ChoiceField(
       #反正要重新赋值,静态字段就没有必要赋值了
        choices=[]
)

def __init__(self,*args,**kwargs):
        super(FM,self).__init__(*args,**kwargs)
        self.fields[‘city3‘].choices=models.city.objects.all().values_list(‘id‘,‘name‘)

这样就实现了动态地改变select内容的效果。

除此以外,Django本身也提供了一个内置的类来实现这个动态效果。

导入类,然后定义一个字段

from django.forms import ModelChoiceField
city4=forms.ModelChoiceField(
        queryset=models.city.objects.all(),
        empty_label=‘请选择城市‘,
)

效果如下

时间: 2024-10-24 01:14:52

Django 表单 (中)-动态实现select效果的相关文章

Django表单处理

我们会从手工打造一个简单的搜索页面开始,看看怎样处理浏览器提交而来的数据.然后我们开始使用Django的forms框架. 搜索 在web应用上,有两个关于搜索获得巨大成功的故事:Google和Yahoo,通过搜索,他们建立了几十亿美元的业务.几乎每个网站都有很大的比例访问量来自这两个搜索引擎.甚至,一个网站是否成功取决于其站内搜索的质量.因此,在我们这个网站添加搜索功能看起来好一些. 开始,在URLconf (mysite.urls)添加搜索视图.添加类似(r'^search/$','mysit

7Python全栈之路系列之Django表单

Python全栈之路系列之Django表单 从Request对象中获取数据 HttpRequest对象包含当前请求URL的一些信息: 熟悉/方法 描述 例如 request.path 除域名以外的请求路径 /hello/ request.get_host() 访问的域名 127.0.0.1:8000" or www.example.com request.get_full_path() 请求路径,可能包含查询字符串 /hello/?print=true request.is_secure() 是

Django表单——概述

参考文献: https://docs.djangoproject.com/zh-hans/2.0/topics/forms/ HTML 表单 一个表单必须明确两个要素: where: 应返回与用户输入相对应的数据的URL how:应该返回数据的HTTP方法 GET和POST GET和POST是处理表单时唯一使用的HTTP方法. 使用POST方法返回Django的登录表单,其中浏览器捆绑表单数据,对其进行编码以进行传输,将其发送到服务器,然后接收其响应. 相反,GET将提交的数据捆绑成一个字符串,

关于创建Django表单Forms继承BaseForm的问题

在创建Django表单时,因为需要验证用户输入的验证码是否正确,因此需要在session里提取当前验证码的值和POST提交过来的值进行比对,如图: 1 form.py 2 3 from django import forms 4 5 class LoginForms(forms.Form): 6 check_code = forms.CharField() 7 def clean_check_code(self): 8 if self.request.session.get('CheckCode

Django表单API详解

声明:以下的Form.表单等术语都指的的广义的Django表单. Form要么是绑定了数据的,要么是未绑定数据的. 如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单.如果未绑定,则无法进行验证(因为没有数据可以验证!),但它仍然可以以HTML形式呈现空白表单. 表单类原型:class Form[source] 若要创建一个未绑定的Form实例,只需简单地实例化该类: f = ContactForm() 若要绑定数据到表单,可以将数据以字典的形式传递给Form类的构造函数

django表单使用forms.ModelForm

win7 python2.7 django 1.6.5 因为使用数据库sqlite,项目中有models.py,所以使用方便的forms.ModelForm处理表单. 上传图像文件使用默认的defaultstorage. 1.settings.py里增加两行media的定义: #Media MEDIA_ROOT = 'e:/Depot/media' MEDIA_URL = '/media/' 2.models.py #coding: utf8 from django.db import mode

django表单验证和跨站伪造csrf

Form验证 django中的Form一般有两种功能: 输入html 验证用户输入 django使用内置form方法验证表单提交的数据 html页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style> .error-msg { color: red; } <

表单工作流动态追加意见到指定字段的方法介绍

度量快速开发平台中,表单工作流配置是很方便实用的,特别是领导审批意见,可以追加到指定的字段中.在表单工作流配置的节点中,审批属性中就可以进行设置.需要注意的是,要用来追加意见的字段,需要是多行文本或者文章类型.普通字段显示不出来. 这里的设置是在属性中设置好.到这个节点审批的时候,审批意见就保存到这个设置好的字段中了.那么,如果有更复杂的业务,填写意见后,在下一步选择不同的流转方向,希望把本次填写的意见写到不同的字段中,也就是说,运行中如何根据条件来动态设置审批意见填写到不同字段中的功能. 我们

Django 表单

学习参考:http://www.runoob.com/django/django-form.html HTTP 请求 HTTP协议以"请求-回复"的方式工作.客户发送请求时,可以在请求中附加数据.服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务. GET 方法 我们在之前项目的C:\Users\XCC\HelloWorld\HelloWorld路径下创建一个 search.py 文件,用于接收用户的请求: # -*- coding: utf-8 -*- fro