Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django管理员如何更改关系字段中的文本_Python_Django_Django Parler - Fatal编程技术网

Python Django管理员如何更改关系字段中的文本

Python Django管理员如何更改关系字段中的文本,python,django,django-parler,Python,Django,Django Parler,我有以下代码: 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) ) c

我有以下代码:

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)
管理员

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新手(第一次),似乎找不到解决这个问题的方法


谢谢大家!

默认情况下,它使用对象的
方法。所以最简单的改变方法就是设置这个方法。例如:

class Federation(models.Model):
    ...

    def __str__(self):
        return "{0} ({1})".format(self.translation, self.created_at)
另一种方法-如果您不想覆盖
\uuu str\uu
方法-将覆盖表单字段本身的
label\u from\u 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

正是我想要的。非常感谢。Python和Django真的让我更喜欢编码方式。