如果可能的话,我想要一些如何使其更通用的指导:
def get_industry_choices(self):
industries = Industry.objects.all().order_by('name')
ind_arr = [(ind.id, ind.name) for ind in industries]
return ind_arr
基本上,此函数将按choices
的预期返回forms.ChoiceField
。我需要在一些地方这样做,并希望使上面的功能更通用。我知道如何让industries = Industry.objects.all().order_by('name')
成为通用的,但第二部分是我不确定的。创建元组时,它有(ind.id, ind.name)
。 ind.name
可以是任何值,具体取决于传入的模型(模型中可能并不总是name
)。
我尝试在以下几个地方阅读:
Passing functions with arguments to another function in Python?
上面的资源显示了如何使用传入的函数来完成它,但这看起来有点矫枉过正?如果我不得不将函数作为参数传递,那么还有一个函数是什么呢?
[编辑]
基本上我想制作类似的东西:
TITLE_CHOICES=(
(1, 'Mr.'),
(2, 'Ms.'),
(3, 'Mrs.'),
(4, 'Dr.'),
(5, 'Prof.'),
(6, 'Rev.'),
(7, 'Other'),
)
因此,在执行forms.ChoiceField
时,我可以传递TITLE_CHOICES
作为可能的选择。第一个值是表单提交时获得的值,第二个值是用户在表单上看到的值。我希望能够以编程方式使用任何模型创建它,我传入模型名称和上面示例中的一个字段name
。我想创建元组,使其为(id, name)
。但name
可以替换为不同模型中的任何内容......
答案 0 :(得分:2)
很难从你的问题中说出来,但我认为你所缺少的是getattr()。例如
ind = something()
for field in ['id', 'name']:
print getattr(ind, field)
答案 1 :(得分:1)
实际上,Django已经有了这样的捷径:values_list
。
Industry.objects.all().values_list('id', 'name')
或
fields = ['id', 'name']
Industry.objects.all().values_list(*fields)
答案 2 :(得分:0)
也许这会有所帮助:
from some_app.models import SomeModel
def generate_choices(model, order=None *args):
choices = model.objects
if order:
choices = choices.order_by(order)
return choices.values_list('pk', *args)
class MyForm(forms.Form):
my_choice_field = CharField(max_length=1,
choices=generate_choices(SomeModel, 'name'))
other_choice_field = CharField(max_length=1,
choices=generate_choices(SomeModel, 'city', 'state'))