2012-08-14 2 views
2

함수가 더 일반적인하고 난이 더 일반적인하는 방법에 가능하면 몇 가지 지침을 원했다. 몇 군데에서이 작업을 수행해야하며, 위의 기능을보다 일반적인 것으로 만들고 싶습니다. 나는 industries = Industry.objects.all().order_by('name')을 일반적인 방법으로 얻는 방법을 알고 있지만 두 번째 부분은 확실하지 않습니다. 튜플을 만들 때는 (ind.id, ind.name)입니다. ind.name은 전달 된 모델에 따라 어떤 값이든 가능합니다 (모델에 항상 name이있는 것은 아닙니다). 파이썬 +는

나는 포함한 몇 군데에서이 위로 읽으려고 :

Passing functions with arguments to another function in Python?

위의 자원이 전달 기능을 사용하여 수행하는 방법을 보여줍니다,하지만 조금 잔인한 것 같다? 어쨌든 인수를 함수로 전달해야한다면, 하나의 함수로 더 일반적인 것으로 만드는 점이 무엇일까요?

[편집]

기본적으로 나는이 비슷한 생성 할 : forms.ChoiceField을 할 때

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

그래서 나는 가능한 선택으로, 예를 들어 TITLE_CHOICES 전달할 수 있습니다. 첫 번째 값은 양식을 제출할 때 얻는 값이고 두 번째 값은 사용자가 양식에 표시 한 값입니다. 위의 예제에서 모델 이름과 필드 하나를 넘겨주는 어떤 모델을 사용하여 프로그래밍 방식으로이 코드를 작성할 수 있기를 원합니다. name. 튜플을 만들려는 것은 (id, name)입니다. 그러나 name은 다른 모델의 어떤 것으로도 대체 될 수 있습니다 ...

+0

+1 – msw

+0

질문은? –

+0

혼란이 생겨서 죄송 합니다만, 내가 누락 된 것이 있는지 궁금해하고, 위의 기능을 최대한 일반화하려고합니다. – KVISH

답변

2

귀하의 질문에서 말하기는 어렵지만, 누락 된 부분은 getattr()입니다. 예를 들어

ind = something() 
for field in ['id', 'name']: 
    print getattr(ind, field) 
+0

그게 효과가있다! 감사. 전에 getattr 메소드를 사용하지 않았습니다. – KVISH

+0

'gimme-codez'와 같은 새로운 태그를 생성하지 마십시오. 질문에 플래그를 지정하십시오. – casperOne

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')) 
1

, 장고는 이미이 바로 가기가 있습니다 values_list.

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

또는 먼저 응답에 대한 검색에 대한

fields = ['id', 'name'] 
Industry.objects.all().values_list(*fields) 
+0

이 방법은 훨씬 더 깔끔한 솔루션이지만이 경우에만 사용해야합니다. 그래서 나는 대부분의 다른 경우에서 작동 할 것이기 때문에 다른 하나는 대답으로 유지할 것이다. – KVISH