Django meta admin ordering - исключая грамматические статьи - PullRequest
2 голосов
/ 01 января 2012

У меня сейчас есть этот код модели:

class Book(models.Model):
    title = models.CharField(max_length=100)
    num_pages = models.IntegerField(blank=True, null=True)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ["title"]

Если у меня есть название книги ' The Fry Chronicles ' или ' Справочник автостопом по Галактике ' (например), есть ли способ заставить Джанго игнорировать те короткие статьи ( an, a, и т. д.) перед словом в интерфейсе администратора, и просто упорядочить результаты по словам, следующим за статьей?

Чтобы сделать еще один шаг вперед, возможно, есть способ выложить результаты, подобные этим ...

  • Хроники Фрая,
  • Автостопом по Галактике, A

Как переместить статью в конец названия книги?

Может ли кто-нибудь предложить решение двух вышеуказанных проблем?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 02 января 2012

Вы можете попробовать,

class Book(models.Model):
    displayed_title = models.CharField(max_length=100)
    ordered_title = models.CharField(max_length=100)

    def __unicode__(self):
        return self.displayed_title

    class Meta:
        ordering = ["ordered_title"]

И просто убедитесь, что вы анализируете ordered_title, прежде чем сохранить его.

1 голос
/ 02 января 2012

Я не думаю, что это возможно без взлома внутреннего кода администратора django.

Однако вы можете сделать небольшой трюк, если некоторая избыточность не является проблемой. В книге есть дополнительное поле, которое представляет заголовок для заказа (например, clean_title) и использование атрибута ordering в admin.

0 голосов
/ 02 января 2012

Не знаю, работает ли это ... не проверено ... просто идея иметь в виду, что django - это просто питон ... Надеюсь, это поможет вам выбрать правильный путь!?!

def splitter(title):  
    list_title=[]
    a = split(title)    
        for word in a:
            if len(word) > 3: # With this you filter "a" "the" etc. but not "Bob" etc.!!
               word.append(list_title)
    return list_tile


class Meta:
    ordering = splitter(title) # not sure if this is working....
...