2016-06-30 4 views
1

가 나는 다음과 같은 코드가 관계 필드에 텍스트를 변경하는 방법 :장고 관리자

models.py를

from django.db import models 
from parler.models import TranslatableModel, TranslatedFields 

class Federation(TranslatableModel): 
    translations = TranslatedFields(
     name = models.CharField('name', max_length=50) 
    ) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

class Athlete(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    federation = models.ForeignKey('Federation', on_delete=models.SET_NULL, null=True) 
    height = models.IntegerField(); 
    weight = models.IntegerField(); 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

이 admin.py

from django.contrib import admin 
from parler.admin import TranslatableAdmin 

from .models import Athlete, Federation 

class AthleteAdmin(admin.ModelAdmin): 
    list_display = ['first_name', 'last_name', 'height', 'weight', 'get_federation_name'] 
    fields = ['first_name', 'last_name', 'height', 'weight', 'federation'] 

    def get_federation_name(self, obj): 
     obj.federation.set_current_language('en') 
     return obj.federation.name 
    get_federation_name.short_description = 'Federation' 

class FederationAdmin(TranslatableAdmin): 
    search_fields = ['translations__name'] 
    list_display = ['name'] 
    fields = ['name'] 

admin.site.register(Federation, FederationAdmin) 
admin.site.register(Athlete, AthleteAdmin) 

페더레이션 필드가 목록으로 표시됩니다 선택 메뉴의 텍스트는 "연합 객체"로 표시됩니다. 이 목록에서는 관련 연합 모델의 번역 관계에서 데이터를 가져 오는 함수를 만들었습니다. 양식 필드에서도 동일한 작업을 수행하려고합니다. 이 기능을 사용하지 않고 양식 필드에서 작동하게하면 같은 방식으로 작동하도록 목록 표시를 변경합니다.

저는 처음으로 Python과 Django에 처음 왔으며이 문제에 대한 해결책을 찾을 수 없습니다.

감사합니다.

답변

1

기본적으로이 개체는 __str__() 메서드를 사용합니다. 따라서 이것을 변경하는 가장 쉬운 방법은이 방법을 설정하는 것입니다. 예를 들어 : - 당신이 __str__ 메소드를 오버라이드 (override)하지 않으려면 -

class Federation(models.Model): 
    ... 

    def __str__(self): 
     return "{0} ({1})".format(self.translation, self.created_at) 

또 다른 방법은 양식 필드 자체의 label_from_instance을 무시하는 것입니다. 하지만 더 까다 롭습니다.

def _federation_label_from_instance(self, obj): 
    return "{0} ({1})".format(obj.translation, obj.created_at) 

class AthleteAdmin(admin.ModelAdmin): 
    ... 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     formfield = super().form_field(db_field, request, **kwargs) 
     if db_field.name == 'federation': 
      formfield.label_from_instance = _federation_label_from_instance 
     return formfield 
+0

정확히 내가 무엇을 찾고 있었습니까. 고맙습니다! 파이썬과 장고는 정말로 내가 코딩 방법을 더 즐겁게 해 주었다. – Gasim