2

如果可能的话,我想要一些关于如何使它更通用的指导:

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在模型中)。

我试图在几个地方阅读此内容,包括:

将带参数的函数传递给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可以用不同型号的任何东西代替...

4

3 回答 3

2

从你的问题很难看出,但我认为你缺少的是getattr()。例如

ind = something()
for field in ['id', 'name']:
    print getattr(ind, field)
于 2012-08-14T04:37:40.417 回答
1

实际上,Django 已经为此提供了一个快捷方式:values_list.

Industry.objects.all().values_list('id', 'name')

或者

fields = ['id', 'name']
Industry.objects.all().values_list(*fields)
于 2012-08-14T08:26:27.473 回答
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'))
于 2012-08-14T05:02:58.640 回答