настроить выбор в админке django - PullRequest
5 голосов
/ 24 марта 2011

У меня есть модель, одно из полей - ForeignKey, так что я вижу select в django admin, возможно ли настроить метки этого select?



class Model(models.Model):
    name = models.CharField()
    def __unicode__(self):
         return self.name

class Part(models.Model):
    name = models.CharField()
    parent =  model.ForeignKey(Model)
    def __unicode__(self):
         return self.name
    def name_with_model(self):
         return self.name + ' ' + parent.name

class SmallPart(models.Model):
    name = models.CharField()
    parent =  model.ForeignKey(Part)

когда я добавляю новый SmallPart, я вижу тег выбора с именами деталей, мне нужно видеть name_with_model

1 Ответ

9 голосов
/ 24 марта 2011

Если вы имеете в виду метку поля:

, используя код из: Django Admin - Переопределение виджета поля пользовательской формы

# forms.py

from django import forms
from django.contrib import admin

class ProductAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ProductAdminForm, self).__init__(*args, **kwargs)
        self.fields['tags'].label = 'Custom Label'

Затем в вашемОбъект ModelAdmin, вы указываете форму:

from django.contrib import admin
from models import Product
from forms import ProductAdminForm

class ProductAdmin(admin.ModelAdmin):
    form = ProductAdminForm

admin.site.register(Product, ProductAdmin)

Если вы имеете в виду метки в выпадающем списке выбора:

Переопределите виджет, как в ответе выше.1015 * edit:

Поле формы по умолчанию для поля fk - это поле выбора модели.Из docs

Метод модели unicode будет вызываться для генерации строковых представлений объектов для использования при выборе поля;чтобы предоставить настраиваемые представления, создайте подкласс ModelChoiceField и переопределите label_from_instance.Этот метод получит объект модели и должен вернуть строку, подходящую для его представления.Например:

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

, а затем:

class SmallPartAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(SmallPartAdminForm, self).__init__(*args, **kwargs)
        self.fields['parent'] = MyModelChoiceField(queryset=Part.objects.all())
...