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')が、2番目の部分はよくわかりません。タプルを作成するときは、があり(ind.id, ind.name)ます。ind.name渡されたモデルに応じて、任意の値にすることができます(モデルに常に含まれているとは限りませんname)。

私はこれを含むいくつかの場所でこれを読んでみました:

Pythonの別の関数に引数を持つ関数を渡しますか?

上記のリソースは、渡された関数を使用してそれを行う方法を示していますが、それは少しやり過ぎのようですか?とにかく関数を引数として渡す必要がある場合、もう1つの関数を使用して関数をより一般的にすることのポイントは何ですか?

[編集]

基本的に私はこれに似たものを作りたいです:

TITLE_CHOICES=(
    (1, 'Mr.'),
    (2, 'Ms.'),
    (3, 'Mrs.'),
    (4, 'Dr.'),
    (5, 'Prof.'),
    (6, 'Rev.'),
    (7, 'Other'),
)

ですから、そうするとき、私は例えば可能な選択肢としてforms.ChoiceField渡すことができます。TITLE_CHOICES最初の値はフォームが送信されたときに取得する値であり、2番目の値はユーザーがフォームに表示する値です。これを任意のモデルでプログラムで作成できるようにしたいので、上記の例ではモデル名と1つのフィールドを渡し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 に答える