Afficher un champs des ForeignKey dans Django-Admin

Le titre est pas super clair, mais je savais pas trop comment le dire..

Le problème exposé dans ce sujet a été résolu.

Bonjour,

J'ai un modèle Product qui prend en ForeignKey un modèle Brand. Ils sont tous les deux enregistrés dans Django-Admin.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
from django.db import models

class Brand(models.Model):
    name        = models.CharField(max_length=64, unique=True)
    website     = models.URLField()
    slug        = models.SlugField()
    description = models.TextField()

class Product(models.Model):
    name        = models.CharField(max_length=64, unique=True)
    brand       = models.ForeignKey(Brand)
    description = models.TextField()
    slug        = models.SlugField()
    created     = models.DateTimeField(auto_now=False, auto_now_add=True)
    edited      = models.DateTimeField(auto_now=True)

J'ai créé un objet Brand que j'ai appellé Test Brand. Quand je veux créer un objet Product, j'ai ma petite liste Brand qui me propose de sélectionner un objet (la ForeignKey). Seulement, celle-ci m'affiche Brand object et non le champs name de l'objet. Comment demander à Django d'indiquer ce nom là ? Je pense qu'une image sera plus clair :

Le problème se trouve au champs Brand

Merci de votre aide ! :)

Je ne connais pas bien Python et Django, mais après quelques recherches j'ai trouvé ça :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Invoice(models.Model):
      person = models.ForeignKey(Person)
      ....

class InvoiceAdmin(admin.ModelAdmin):
      form = MyInvoiceAdminForm


class MyInvoiceAdminForm(forms.ModelForm):
    person = CustomModelChoiceField(queryset=Person.objects.all()) 
    class Meta:
          model = Invoice

class CustomModelChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "%s %s" % (obj.first_name, obj.last_name)

Source : http://stackoverflow.com/questions/6836740/django-admin-change-foreignkey-display-text#answer-6851344

Est-ce que ça correspond à ce que tu cherches ?

La documentation parle un peu de cette fonction label_from_instance.

+0 -0

Merci de ta réponse. En faite la solution était bien plus simple, il me manquais la méthode __str__ dans mes deux modèles :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
class Brand(models.Model):
    name        = models.CharField(max_length=64, unique=True)
    website     = models.URLField()
    logo        = models.URLField()
    slug        = models.SlugField()
    description = models.TextField()

    def __str__(self):
        return self.name

class Product(models.Model):
    name        = models.CharField(max_length=64, unique=True)
    brand       = models.ForeignKey(Brand)
    description = models.TextField()
    image       = models.URLField()
    slug        = models.SlugField()
    created     = models.DateTimeField(auto_now=False, auto_now_add=True)
    edited      = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

Merci encore et bonne soirée. :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte