Djago - Form组件动态绑定数据

目录

  • Form组件动态绑定数据

    • 一、概述(以单选下拉框为例)
    • 二、分析
    • 三、解决方法一
    • 四、解决方法二

Form组件动态绑定数据

一、概述(以单选下拉框为例)

用Form组件生成下拉框时,通常下拉框内的数据从数据库中获取。当在数据库中更新或者添加数据时,发现在刷新浏览器页面时,下拉框内的数据无变化。需要重新启动django在实际中这是不合理的

# views.py
class Test2Form(forms.Form):
    user = fields.ChoiceField(choices=models.UserInfo.objects.values_list('id','username'))

def test2(request):
    obj = Test2Form()
    return render(request,'test2.html',{"obj":obj})

# 数据库
id  username   email
1    小白      [email protected]
2    小花      [email protected]

# html
<span>姑娘:{{ obj.user }}</span>

二、分析

step1:django启动时,class类就会运行,下拉框中获取数据库中的数据

step2:添加或修改数据库中的数据,刷新浏览器页面。下拉框中的数据不随着更新

step3:因为在刷新页面时,class中的类属性并不会再重新生成,所以一直保留最开始的数据

三、解决方法一

推荐使用:在类中重写__init__()方法,在页面刷新实例会对象时,执行方法更新数据

class Test2Form(forms.Form):
    user = fields.ChoiceField()

    # 在类中定义__init__()函数
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)

        # self.fields必须写在super()下面。因为super会将类属性全拷贝,self.filelds才能取到值
        self.fields['user'].choices=models.UserInfo.objects.values_list('id','username')
def test2(request):
    obj = Test2Form()
    return render(request,'test2.html',{"obj":obj})

四、解决方法二

使用django自带的ModelChoiceField字段生成下拉框。看起来似乎比方法一简单,但是不推荐使用。因为需要在models中写str方法。如果在另一个的下拉框中要显示别的字段就不好操作了,与models耦合度高

from django.forms.models import ModelChoiceField  # 需要导入
class Test2Form(forms.Form):
    user = ModelChoiceField(queryset=models.UserInfo.objects.all(),to_field_name='username')
    '''
        queryset,                  # 查询数据库中的数据
        empty_label="---------",   # 默认空显示内容
        to_field_name=None,        # HTML中option中value的值对应的字段
     '''
在浏览器页面下拉框中显示 '表名 object' ,所以还需要修改model.py文件
# models.py
class UserInfo(models.Model):
    username=models.CharField(max_length=32)
    email=models.EmailField(max_length=32)

    def __str__(self):
        return self.username

原文地址:https://www.cnblogs.com/863652104kai/p/11444434.html

时间: 2024-09-30 11:21:20

Djago - Form组件动态绑定数据的相关文章

Form 组件动态绑定数据

1.Form 组件的作用: a.对用户提交的数据进行验证(form表单/ajax) b.保留用户上次输入的信息 c.可以生成html标签(input表单类的标签) 2..由于form组件中每个字段都是类的数据属性(全局变量),在类每次实例化之后,数据属性不会发生改变,会保留上次的更新结果 导致无法动态显示数据库的内容: from django.shortcuts import render from django import forms from django.forms import fie

python---django中form组件(数据添加前使用自定义方法进行验证,以及源码分析)

form组件代码: from app02.models import Userfrom django.core.exceptions import ValidationError class AjaxForm(forms.Form): user = fields.CharField( required=True, min_length=3, max_length=7, ) email = fields.EmailField( required=True, ) #自定义方法 clean_字段名 #

Django之form组件提交数据如何验证数据库中是否存在

方式一,直接判断 方式二,从源码入手 如果要验证username是否在数据库中存在,先查看源码,由于数据验证是从  obj.is_valid()方法开始验证,所以进入这个方法 依次查看 回到form类 必须要抛出ValidationError异常,导入这个异常 原文地址:https://www.cnblogs.com/zq8421/p/10439267.html

[oldboy-django][2深入django]Form组件功能: 数据格式验证 + 保留上次输入的值(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)

1 需求:登录或者注册页面存在以下问题 - 无法记住上次提交的内容,(如果有很多输入项,这样正确项不必重复输入,错误项也能提示错误信息)- 重复进行提交数据的校验(数据是否为空,长度大小等等) 2 django的Form组件实现 2.1 Form组件实现数据验证方法 2.1.1 流程操作 - 定义规则(数据的格式,字段必须和表单上name属性一致) class LoginForm(Form): 字段名 = fields.xxFields(参数) # 定义了一个输入框的数据格式要求 实例化对象ob

六十一、Django之form组件

一.form组件 1.校验数据 # 第一步需要一个form类 from django import forms class MyForm(forms.Form): name = forms.CharField(max_length=6) password = forms.CharField(max_length=8,min_length=3) email = forms.EmailField(required=True) #第二步实例化form对象 form_obj = MyForm({'nam

Django form组件 与 cookie/session

目录 一.form组件 二.cookie.session 一.form组件 1.1 以注册功能为例 注册功能 1.渲染前端标签获取用户输入 --> 渲染标签 2.获取用户输入传递到后端校验 --> 校验数据 3.校验未通过展示错误信息 --> 展示信息 ps:校验数据:前后端都可以校验,但是前端可以不做,后端必须得做!!! 1.2 校验数据 校验数据 第一步需要一个form类 from django import forms class MyForm(forms.Form): name

django之form组件、cookie、session

django之form组件.cookie.session django form组件 1.渲染标签 2.校验数据 3.展示信息 校验数据 # 第一步需要一个form类 from django import forms class MyForm(forms.Form): name = forms.CharField(max_length=8) password = forms.CharField(max_length=8,min_length=3) email = forms.EmailField

Django 之 Form组件

普通方式手写注册功能 def reg(request): errors = {'username':'','password':''} if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') if 'sb' in username: errors['username'] = '用户名不能有sb' if password.isdigit(

Python Django 多对多三种创建方式 form组件 cookie和session

一 表中多对多关系三种创建方式 以Book表和Author表多对多关系例 1.第一种方式:全自动(推荐使用):models.ManyToManyField(to='类名') 优点:不需要你手动创建第三张表 缺点:第三张表不是你手动创建的,字段是固定的无法拓展 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=8,decimal_place