Py学习  »  Django

Djnago如何实现form下拉列表的动态加载?

好梦一场睡-weibo • 9 年前 • 12077 次点击  

我想实现在表单中CharFiled中choices选项,直接加载数据库的某一列数据,而不是直接在表单中设置好数值,然后赋给choices参数,我目前实现了一个这样的: queue = forms.ChoiceField(label=u'队列',choices=((x.que,x.disr) for x in Queue.objects.all())) 但是这好像还是实现不了动态加载,当我在数据库中添加一条记录时,重启服务才能在下拉列表中找到,大家有什么好的方法吗?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/904
 
12077 次点击  
文章 [ 16 ]  |  最新文章 7 年前
1871104060@qq.com
Reply   •   1 楼
1871104060@qq.com    7 年前

请问怎么实现动态的下拉菜单加载呢,求实例

HelloSam
Reply   •   2 楼
HelloSam    8 年前

@liufeily 请问用 foreignkey怎么实现?

Kris
Reply   •   3 楼
Kris    8 年前

在使用Admin时,我也遇到了这种情况。补充一点,如果是ModelForm 调用choiceField的时候应该使用self.declared_fields['first_theme'].choices

gogo
Reply   •   4 楼
gogo    9 年前

class Myform(forms.Form): def init(self, *args,kwargs): super(Myform, self).__init__(*args,kwargs) self.fields['field'] = forms.ChoiceField( label = u'', required = True, widget = forms.Select, choices = get_choice_list(), )

好梦一场睡-weibo
Reply   •   5 楼
好梦一场睡-weibo    9 年前

@liufeily 没办法呀,现在还是菜鸟一个。

好梦一场睡-weibo
Reply   •   6 楼
好梦一场睡-weibo    9 年前

@liaozd 方法可行

好梦一场睡-weibo
Reply   •   7 楼
好梦一场睡-weibo    9 年前

@kinegratii 我试了一下这个可以,还可以使用这种方法:

queue = forms.ModelChoiceField(label=u'队列',queryset=Queue.objects.all())

这样会返回一个数据库对象

37丫37
Reply   •   8 楼
37丫37    9 年前

感觉有点low啊,直接ForeignKey就可以了。

olivetree
Reply   •   9 楼
olivetree    9 年前

@kinegratii 有什么区别?没明白

liaozd
Reply   •   10 楼
liaozd    9 年前

@kinegratii 啊!同意!

def __init__(self, *args, **kwargs):
    super(self.__class__, self).__init__(*args, **kwargs)
    self.fields['queue'].choices = ((x.que,x.disr) for x in Queue.objects.all()))
kinegratii
Reply   •   11 楼
kinegratii    9 年前

这是因为,choices参数的值是立即计算的,第一次是什么以后就是什么了

__init__函数中使用动态加载

    self.fields['queue'].choices = ((x.que,x.disr) for x in Queue.objects.all()))
olivetree
Reply   •   12 楼
olivetree    9 年前

@liaozd 刷新页面没用的,强制刷新也还是会出现这样的问题。就是django的缓存问题

liaozd
Reply   •   13 楼
liaozd    9 年前

回不回可能前端有关系,需要刷新页面。

olivetree
Reply   •   14 楼
olivetree    9 年前

这是因为查询的结果集是有缓存的,你试试这样的语句(我没试过,网上有人说可以避免使用缓存):

star_set = Star.objects.all()
# iterator()可以一次只从数据库获取少量数据,这样可以节省内存
for star in star_set.iterator():
    print(star.name)
好梦一场睡-weibo
Reply   •   15 楼
好梦一场睡-weibo    9 年前

@liaozd 已经save()了,我在数据库中都能查到。

liaozd
Reply   •   16 楼
liaozd    9 年前

有可能是你的object没有save,Queue.save()了么?