2011-03-24 30 views
5

Tengo un modelo, uno de los campos es ForeignKey, entonces veo seleccionar en django admin, ¿es posible personalizar las etiquetas de esta selección?personalizar seleccionar en django admin



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) 

cuando añado la nueva SmallPart veo seleccione la etiqueta con los nombres de las piezas, que tienen que ver name_with_model

Respuesta

9

Si se refiere a la etiqueta del campo:

utilizando el código 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' 

Luego, en su objeto ModelAdmin, especifique la forma:

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 se refiere a las etiquetas en el menú desplegable de selección:

Anular el widget como en la respuesta anterior.

edición:

El campo de formulario predeterminado para un campo de FK es un campo modelo de elección. Desde el docs

El Unicode método del modelo será llamado para generar cadena representaciones de los objetos de uso en las opciones del campo; para proporcionar representaciones personalizadas, subclase ModelChoiceField y anular label_from_instance. Este método recibirá un objeto modelo, y debe devolver una cadena adecuada para que lo represente. Por ejemplo:

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

y luego:

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

es como si yo (mi pregunta no está claro), es necesario que actualice

+1

Puede hacerlo anulando el widget. ¿Cómo estás modificando los valores? Basado en una función? Por favor publique un código o aclare en su publicación. ¡Gracias! – DTing

+0

He actualizado la pregunta, he agregado el código –