首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >场景所需的解决方案

场景所需的解决方案
EN

Stack Overflow用户
提问于 2018-12-27 10:08:27
回答 2查看 48关注 0票数 0

我正在尝试使用列的值作为单选按钮的选择,使用下面的代码

Forms.py

代码语言:javascript
复制
#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)中,当试图在索引页上显示数据或选择时,直到服务器重新启动才能反映出来。

有人能帮忙吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-27 11:00:54

当然,“它在服务器重新启动之前不会反映”--这一点很明显,当您记住django服务器进程是长时间运行的进程时(这不像每个请求重新执行每个脚本的PHP ),并且顶层代码(位于模块顶层的代码,而不是函数中的代码)在模块第一次导入时每个进程只执行一次。一般规则是:不要在模块的顶层或类语句的顶层执行任何db查询--最好是得到陈旧的数据,更糟糕的是,它会使服务器进程崩溃(如果在django正确设置所有内容之前执行查询,或者在应用迁移之前基于模式更新执行查询)。

可能的解决方案是等待窗体初始化以设置您的字段的选择,或者传递一个可调用的formfield的choices选项cf https://docs.djangoproject.com/en/2.1/ref/forms/fields/#django.forms.ChoiceField.choices

此外,构建选择列表的方式也是非常复杂的--您可以将其作为一条直线来完成:

代码语言:javascript
复制
  OPTIONS = list(enumerate(polls_datum.objects.values_list('poll_choices', flat=True)) 

但是它也非常脆弱--当您应该使用polls(为了稳定起见)时,您依赖于当前的db内容和选择值的排序。

最后:由于您使用的是一个似乎相关的模型,所以您可能需要使用ModelChoiceField

票数 1
EN

Stack Overflow用户

发布于 2018-12-27 10:57:34

供日后参考:

  1. 你用的是什么版本的Django?
  2. 你读过ModelForms?https://docs.djangoproject.com/en/2.1/topics/forms/modelforms/的文档吗?
  3. 我不知道你想用diction做什么,把字典变成元组。我认为你可以跳过一步,你未来的自我会为此感谢你。
  4. 试着遵循一些教程,并理解为什么要采取某些步骤。我从您的代码中可以看出,您对编码或Python相当陌生,还有改进的余地。不是试图说服你,但我试图把你推向成为一个更好的开发人员的方向;-)

实答案

尽管如此,我认为解决方案是在表单模型的某个地方编写数据加载,而不是在forms.py中“松散”。有关此问题的更多信息,请参见bruno的答复。

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53943226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档