フォーム成分動的結合データ
まず、概要(無線ドロップダウンボックスと、例えば)
ドロップダウンボックスフォーム成分を生成する、典型的にはドロップダウンボックスデータをデータベースから取得しました。データベース内のデータを追加または更新する場合、我々はあなたがブラウザページを更新すると、ドロップダウンボックスというデータをそのままました。あなたはジャンゴを再起動する必要があり、実際にそれが合理的ではありません
# 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は起動すると、クラスのクラスは、データベースのドロップダウンボックス内のデータを取得し、実行します
STEP2:ブラウザのページを更新し、データベースにデータを追加または変更。ドロップダウンボックスのデータが更新されないと
STEP3:あなたはページを更新すると、クラスのプロパティのクラスが再び再生しないので、データ保持の始まりとなっています
第三に、ソリューション
推奨用途:ページは、メソッドの更新データを実行し、オブジェクトのインスタンスをリフレッシュしますクラスの書き換え__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})
IVソリューション2
DjangoはModelChoiceFieldフィールドはドロップダウンボックスを生成しています使用してください。これは、方法よりも簡単そうですが、お勧めできません。モデルのSTR法を記述する必要があるため。他のフィールドに表示される別のドロップダウンボックスが動作しない場合は、高と相まってモデル
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