2010-08-17 3 views
1

사용자를 forgignKey로 사용하는 모델이 있습니다. 그리고 관리자, 난 그것을 사용자 이름의 전체 이름 instread로 표시해야합니다. 그때 나는 신청했다django : 주문 및 표시 이름 충돌

class CollaboratorInLine(admin.StackedInline): 
    model = Collaborator 
    #list_display = ('collaborator__collaborator_first_name') 
    extra = 0 
    form =CollaboratorForm 
    #raw_id_fields=("collaborator",) 

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs): 
     field = super(CollaboratorInLine, self).formfield_for_foreignkey(
               db_field, request, **kwargs) 
     if db_field.rel.to == User: 
      field.label_from_instance = self.get_user_label 
     return field 
    def formfield_for_manytomany(self, db_field, request=None, **kwargs): 
     field = super(CollaboratorInLine, self).formfield_for_manytomany(
               db_field, request, **kwargs) 
     if db_field.rel.to == User: 
      field.label_from_instance = self.get_user_label 
     return field 
    def get_user_label(self, user): 
     name = user.get_full_name() 
     return name 

그것은 fullnames를 가진 드롭 다운 명부로 잘 작동한다. 그런 다음 알파벳순으로 정렬하고 싶습니다. 그 다음이 적용됨

class CollaboratorForm(forms.ModelForm): 
    collaborator = forms.ModelChoiceField(queryset=User.objects.order_by('first_name')) 
    #assert False,collaborator 
    class Meta: 
     model = Collaborator 

이 적용됩니다. 전체 이름은 다시 사용자 이름이됩니다. 내가 그것을 제거하면 그것은 완전한 이름이됩니다. 두 기능을 모두 유지하려면 어떻게해야합니까?

감사

답변

0

시도 서브 클래 싱 ModelChoiceField 및 전체 이름을 표시하는 label_for_instance 메소드를 오버라이드 (override).

class MyModelChoiceField(ModelChoiceField): 
    def label_from_instance(self, obj): 
     return obj.get_full_name() 

그런 다음 모델 양식에 새 필드를 사용하십시오.

class CollaboratorForm(forms.ModelForm): 
     collaborator = MyModelChoiceField(queryset=User.objects.order_by('first_name')) 
     #assert False,collaborator 
     class Meta: 
      model = Collaborator 
+0

안녕하세요 Alasdair; CollaboratorInLine에서 작동합니다. 하지만 어떻게 클래스 보고서 (models.Model) 다음과 같은 인라인하지 whcih 보고서 제출자에 대한 : 팀 = models.ForeignKey (팀) 프로젝트 = models.CharField (MAX_LENGTH = 255) 요약 = models.TextField() submitter = models.ForeignKey (사용자, editable = True, related_name = 'report_submitter') – Grey

+0

나는 같은 방법을 시도했다. 하지만 제출자에 대한 작업을하지 않았다 – Grey

+0

내 나쁜 내가 양식을 할당 잊어 버렸습니다. 덕분에 Alasdair 완벽하게 작동합니다. – Grey