2016-06-30 17 views
1

は、私は次のコードを持っている関係フィールドにテキストを変更する方法:Djangoの管理

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) 

フェデレーションフィールドがリストとして表示され選択メニューのテキストは「フェデレーションオブジェクト」として表示されます。このリストについては、関連するFederationモデルの翻訳関係からデータを取得する関数を作成しました。私はフォームフィールドで同じことをしたい。これをフォームフィールドで機能させないようにすると、同じように動作するようにリスト表示を変更します。

私はPythonとDjango(初回)には新しく、この問題の解決策を見つけることができません。

ありがとうございました!

答えて

1

デフォルトでは、オブジェクトの__str__()メソッドが使用されます。したがって、これを変更する最も簡単な方法は、このメソッドを設定することです。例えば: - あなたは__str__メソッドをオーバーライドしない場合 -

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

私が探していたものです。ありがとうございました! PythonとDjangoは本当に私のコーディング方法をもっと楽しませました。 – Gasim