2010-05-17 3 views
1

ModelMultipleChoiceField를 사용자 정의 쿼 리셋을 사용하도록 설정하는 방법에 대한 모든 방법을 보았습니다. 시도해 보았습니다. 그러나 모두 동일한 패러다임을 사용합니다. 쿼리 세트는 동일한 개체의 필터링 된 목록입니다.ModelMultipleChoiceField의 쿼리 세트를 사용자 정의 레코드 세트로 동적으로 설정하기

제 경우에는 관리자가 텍스트 부분으로 사용자 이름을 사용하는 대신 다중 선택 양식을 그려야합니다. 내 계정 클래스의 name 필드를 사용하고 싶습니다. 그러나, 나는 Account.name 속성과 User.id 재산으로 선택 박스를 그릴 위의 queryset을 원이 작동

# models.py 
class Account(models.Model): 
    name = models.CharField(max_length=128,help_text="A display name that people understand") 
    user = models.ForeignKey(User, unique=True) # Tied to the User class in settings.py 

class Organisation(models.Model): 
    administrators = models.ManyToManyField(User) 


# admin.py 
from django.forms import ModelMultipleChoiceField 
from django.contrib.auth.models import User 

class OrganisationAdminForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     from ethico.accounts.models import Account 
     self.base_fields["administrators"] = ModelMultipleChoiceField(
      queryset=User.objects.all(), 
      required=False 
     ) 
     super(OrganisationAdminForm, self).__init__(*args, **kwargs) 

class Meta: 
    model = Organisation 

:

는 여기에 내가 뭘 찾았는지의 고장입니다. 이 작동하지 않았다 :이 오류로 인해 실패

queryset=Account.objects.all().order_by("name").values_list("user","name") 

:

'tuple' object has no attribute 'pk' 

나는이 쉽게 될 것이라고 생각하지만, 그것은 죽은 엔드의 시간에 켜져. 누군가 빛을 비추는 데 관심이 있습니까?

답변

1

맞춤 위젯을 사용하여 render 메소드를 재정의 할 수 있습니다. 여기가 텍스트 필드에 한 일입니다 :

class UserToAccount(forms.widgets.TextInput): 
    def render(self, name, value, attrs=None): 
     if isinstance(value, User) : 
      value = Account.objects.get(user=value).name 
     return super (UserToAccount, self).render(name, value, attrs=None)   

그런 다음 물론, 사용자 정의 위젯을 사용하기 위해, 관리자 필드의 widget 매개 변수를 사용합니다. select에 맞게 조정할 수 있는지는 잘 모르겠지만 사용해 볼 수 있습니다.

+0

내가 왜 투표를 했습니까? 설명 할 수 있니? – sebpiq

0

쿼리 세트는 QuerySet이어야하며, values_list를 수행하면 목록이 나타나지 않으므로 쿼리가 작동하지 않습니다.

모델의 기본 표시를 변경하려면 __unicode__을 무시하십시오. 예를 들어 http://docs.djangoproject.com/en/dev/ref/models/instances/#unicode

참조 : 당신이 모델을 인쇄를 요청 할 때마다

def __unicode__(self): 
    return u"%s for %s" % (self.name, self.user) 

장고 __unicode__을 사용합니다. 테스트를 위해 셸에서 모델을로드하고 print my_instance을 수행하면됩니다.

+0

나는이 경우를 제외하고, 문제의 모델이 내가 제어하지 않는 사용자 인 것을 제외하고는 정확히 할 것이다. User 클래스의 __unicode__ 속성을 조정하는 방법을 알고 있습니까? –

0

는 sebpiq에서 큐를 가지고 가서, 나는 그것을 알아 내기 위해 관리 :

class OrganisationAdminForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 

     from django.forms import MultipleChoiceField 
     from ethico.accounts.models import Account 

     self.base_fields["administrators"] = MultipleChoiceField(
      choices=tuple([(a.user_id, a.name) for a in Account.objects.all().order_by("name")]), 
      widget=forms.widgets.SelectMultiple, 
      required=False 
     ) 

     super(OrganisationAdminForm, self).__init__(*args, **kwargs) 

    class Meta: 
     model = Organisation 


class OrganisationAdmin(admin.ModelAdmin): 
    form = OrganisationAdminForm 


admin.site.register(Organisation, OrganisationAdmin) 

의 핵심은 전부의 검색어를 포기했다. 고정 choices= 매개 변수를 사용하면 모든 것이 제대로 작동합니다. 모두에게 감사드립니다!

관련 문제