2011-03-24 9 views
5

J'ai un modèle, un champ de celui-ci est un ForeignKey, donc je vois sélectionner dans admin django, est-il possible de personnaliser les étiquettes de ce select?personnaliser dans admin django



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) 

quand j'ajouter de nouveaux SmallPart je vois balise select avec les noms des parties, je dois voir name_with_model

Répondre

9

Si vous voulez dire l'étiquette du champ:

en utilisant le code de: Django Admin - Overriding the widget of a custom form field

# 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' 

Puis, dans votre objet ModelAdmin, vous spécifiez le formulaire:

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

class ProductAdmin(admin.ModelAdmin): 
    form = ProductAdminForm 

admin.site.register(Product, ProductAdmin) 

Si vous voulez parler des étiquettes dans la liste déroulante, sélectionnez:

Remplacer le widget comme dans la réponse ci-dessus.

modifier:

Le champ de formulaire par défaut pour un champ de fk est un champ de choix du modèle. De la méthode docs

Le unicode du modèle sera appelé à générer chaîne représentations des objets à usage dans les choix du terrain; pour fournir des représentations personnalisées , sous-classe ModelChoiceField et remplacer label_from_instance. Cette méthode va recevoir un objet de modèle, et devrait retourner une chaîne appropriée pour le représentant. Par exemple:

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

puis:

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

regard est comme vous me comprenez mal (ma question n'a pas été claire), je dois mettre à jour

+1

Vous pouvez le faire en remplaçant le widget. Comment modifiez-vous les valeurs? Basé sur une fonction? S'il vous plaît poster un code ou clarifier dans votre message. Merci! – DTing

+0

J'ai mis à jour la question, j'ai ajouté le code –