我正在尝试使用以下代码将列的值用作单选按钮的选择
Forms.py
#retreiving data from database and assigning it to diction list
diction = polls_datum.objects.values_list('poll_choices', flat=True)
#initializing list and dictionary
OPTIONS1 = {}
OPTIONS = []
#creating the dictionary with 0 to no of options given in list
for i in range(len(diction)):
OPTIONS1[i] = diction[i]
#creating tuples from the dictionary above
#OPTIONS = zip(OPTIONS1.keys(), OPTIONS1.values())
for i in OPTIONS1:
k = (i,OPTIONS1[i])
OPTIONS.append(k)
class polls_form(forms.ModelForm):
#retreiving data from database and assigning it to diction list
options = forms.ChoiceField(choices=OPTIONS, widget = forms.RadioSelect())
class Meta:
model = polls_model
fields = ['options']
使用表单我正在将数据或选择保存在字段(poll_choices)中,当尝试将其显示在索引页上时,直到服务器重新启动后它才反映出来。
有人可以帮忙吗
答案 0 :(得分:1)
当然“它直到服务器重新启动才反映出来”-当您记得django服务器进程是长时间运行的进程(这不像PHP那样,每个脚本都在每个请求上重新执行)时,这很明显。首次导入模块时,每个进程仅执行一次级别代码(位于模块顶层而不是函数中的代码)。通常的规则是:不要在模块的顶级或类语句的顶级执行任何数据库查询-充其量您会得到陈旧的数据,更糟糕的是,它会使服务器进程崩溃(如果您这样做,在Django正确设置所有内容之前重新执行查询,或者在应用迁移之前是否基于架构更新进行查询。
可能的解决方案是等待表单初始化以设置您的字段选择,或者将可调用方法作为表单字段的choices
选项传递,参见https://docs.djangoproject.com/en/2.1/ref/forms/fields/#django.forms.ChoiceField.choices
此外,您构建选择列表的方式无用地复杂-您可以将其作为单行代码来完成:
OPTIONS = list(enumerate(polls_datum.objects.values_list('poll_choices', flat=True))
但是它也非常脆弱-当您应该使用polls_datum的pk时(这是稳定的),您依赖于当前的数据库内容和对选择值的排序。
最后:由于您正在使用似乎是相关的模型,因此您可能想使用ModelChoiceField
。
答案 1 :(得分:-1)
供以后参考:
diction
字典到元组。我认为您可以在此跳过一步,将来的自己会为此感谢您。真实答案:
话虽如此,我认为解决方案是将数据加载写入表单模型中的某个位置,而不是在forms.py
中“松散”。有关更多信息,请参见bruno的答案。
如果要在每次加载表单的请求上重新加载数据,则应创建一个在每次加载表单时都会调用的函数(例如,在表单的__init__
函数中)。