Ordre des colonnes de la liste des modifications de l'administrateur Django en sortie de la méthode __unicode () __

StackOverflow https://stackoverflow.com/questions/1406745

  •  05-07-2019
  •  | 
  •  

Question

Voici une partie des models.py de mon application Django:

class Person(models.Model):
    birth_year = WideYear(null=True, blank=True)
    birth_year_uncertain = models.BooleanField()
    death_year = WideYear(null=True, blank=True)
    death_year_uncertain = models.BooleanField()
    flourit_year = WideYear(null=True, blank=True)
    flourit_year_uncertain = models.BooleanField()
    FLOURIT_CHOICES = (
        (u'D', u'Birth and death dates'),
        (u'F', u'Flourit date'),
    )
    use_flourit = models.CharField('Date(s) to use', max_length=2, choices=FLOURIT_CHOICES)
    index_entries = models.ManyToManyField(IndexEntry, null=True, blank=True)
    def __unicode__(self):
        if self.personname_set.filter(default_name__exact=True):
            name = z(self.personname_set.filter(default_name__exact=True)[0])
        else:
            name = u'[Unnamed person]'
        if self.use_flourit == u'D':
            dates = '%s - %s' % (z(self.birth_year), z(self.death_year))
        else:
            dates = 'fl. ' + z(self.flourit_year)
        return '%s (%s)' % (name, dates)

class PersonName(models.Model):
    titles = models.CharField(max_length=65535, null=True, blank=True)
    surname = models.CharField(max_length=255, null=True, blank=True)
    first_name = models.CharField(max_length=255, null=True, blank=True)
    middle_names = models.CharField(max_length=255, null=True, blank=True)
    post_nominals = models.CharField(max_length=65535, null=True, blank=True)
    default_name = models.BooleanField()
    person = models.ForeignKey(Person, null=True, blank=True)
    def __unicode__(self):
        return '%s, %s %s' % (self.surname, self.first_name, self.middle_names)
    class Meta:
        unique_together = ("titles", "surname", "first_name", "middle_names", "post_nominals", "person")
        unique_together = ("default_name", "person")

et voici les parties correspondantes de l'admin.py de mon application:

from reversion.admin import VersionAdmin

class PersonNameInline(admin.TabularInline):
    model = PersonName
    extra = 1

class PersonAdmin(VersionAdmin):
    radio_fields = {"use_flourit": admin.HORIZONTAL}
    inlines = [PersonNameInline]

admin.site.register(Person, PersonAdmin)

Dans l’administrateur, cela produit une liste de modifications comme suit:

 screencap
(source: sampablokuper.com )

Comme vous pouvez le constater, même si la liste de modifications renseigne chaque ligne de la colonne Personne avec le résultat de la méthode __unicode () __ de la classe Personne , pas ordonner les lignes de cette colonne à l'aide de la méthode __unicode () __ de la classe Personne .

Comment puis-je le faire?

Merci d'avance!

Était-ce utile?

La solution

La commande de Django est effectuée au niveau de la base de données. Si vous ne stockez pas le résultat de votre fonction unicode dans la base de données, django ne pourra pas renvoyer en natif les résultats ordonnés de cette manière.

Stocker une valeur de commande dans la base de données est probablement le moyen le plus rapide de résoudre ce problème.

Autres conseils

Cliquez simplement sur le même problème et le lien suivant a été utile. Au lieu de trier par unicode, il tente de trier plusieurs colonnes, ce qui peut aider à résoudre le problème:

http://djangosnippets.org/snippets/2110/

Après Paul McMillan's suggestion , j’ai ajouté la ligne suivante à la définition de classe de Personne :

ordering_string = models.CharField(max_length=255, null=True, blank=True)

J'ai également placé ceci au-dessus de la définition Nom de la personne dans models.py:

def post_save_person_and_person_name(sender, **kwargs):
    person_name = kwargs['instance']
    person = person_name.person
    if person.ordering_string != unicode(person)[0:254]:
        person.ordering_string = unicode(person)[0:254]
        super(Person, person).save()

et placez-le sous la définition Nom de la personne dans models.py:

post_save.connect(post_save_person_and_person_name, sender=PersonName)

Jusqu'ici, tout va bien.

Je pense que je pourrais peut-être l’améliorer en remplaçant l’appel save () ci-dessus par un queryset update (). Je serais heureux de recevoir des suggestions à ce sujet!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top