方案所需的解决方案

时间:2018-12-27 10:08:27

标签: python django

我正在尝试使用以下代码将列的值用作单选按钮的选择

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)中,当尝试将其显示在索引页上时,直到服务器重新启动后它才反映出来。

有人可以帮忙吗

2 个答案:

答案 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)

供以后参考:

  1. 您使用的是哪个版本的Django?
  2. 您是否阅读了ModelForms文档? https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/
  3. 我不确定您要如何使用diction字典到元组。我认为您可以在此跳过一步,将来的自己会为此感谢您。
  4. 尝试遵循一些教程并了解为什么要采取某些步骤。从您的代码中可以看出,您是刚接触编码或Python的人,还有改进的空间。不想让您失望,但我正在努力将您推向成为更好的开发人员的方向;-)

真实答案

话虽如此,我认为解决方案是将数据加载写入表单模型中的某个位置,而不是在forms.py中“松散”。有关更多信息,请参见bruno的答案。

如果要在每次加载表单的请求上重新加载数据,则应创建一个在每次加载表单时都会调用的函数(例如,在表单的__init__函数中)。