У Django есть способ автоотсортировать образцовые поля?

Так в основном у меня есть довольно большое движение проекта Django. Это - частный веб-портал, который позволяет пользователям управлять различными связанными с телефоном задачами.

Несколько страниц портала предоставляют список Объектов модели пользователям и перечисляют все их атрибуты в HTML-таблице (так, чтобы пользователи могли визуально просмотреть список этих объектов).

Проблема, которую я имею: Я не могу найти Django-выход или pythonic способ обработать сортировку этих Объектов модели именем поля. Как пример того, что я говорю о, вот одно из моих представлений, которое перечисляет все Partyline Объекты модели:

def list_partylines(request):
    """
    List all `Partyline`s that we own.
    """

    # Figure out which sort term to use.
    sort_field = request.REQUEST.get('sortby', 'did').strip()
    if sort_field.startswith('-'):
        search = sort_field[1:]
        sort_toggle = ''
    else:
        search = sort_field
        sort_toggle = '-'

    # Check to see if the sort term is valid.
    if not (search in Partyline._meta.get_all_field_names()):
        sort_field = 'did'

    if is_user_type(request.user, ['admin']):
        partylines = Partyline.objects.all().order_by(sort_field)
    else:
        partylines = get_my_partylines(request.user, sort_field)

    variables = RequestContext(request, {
        'partylines': partylines,
        'sort_toggle': sort_toggle
    })
    return render_to_response('portal/partylines/list.html', variables)

Код сортировки в основном позволяет пользователям указывать / URL/? параметр sortby=model_field_name, который затем возвратит отсортированный список объектов каждый раз, когда пользователи нажимают на название HTML-таблицы, отображенное на странице.

Так как у меня есть различные представления в различных приложениях, которые все шоу список Объектов модели, и требует сортировки, я задаюсь вопросом, существует ли универсальный способ сделать эту сортировку так, чтобы я не имел к?

Я сожалею, если этот вопрос немного неясен, я изо всех сил пытаюсь найти правильный способ формулировать этот вопрос.

Спасибо.

1
задан rdegges 4 June 2010 в 21:15
поделиться

2 ответа

Я бы посмотрел на это с помощью специального QuerySet. В своей модели вы можете определить класс QuerySet и добавить туда свою сортировку. Чтобы сохранить всю логику в объекте модели, я бы также переместил содержимое get_my_partylines в QuerySet.

## This class is used to replicate QuerySet methods into a manager.
## This way:  Partyline.objects.for_user(foo) works the same as
## Partyline.objects.filter(date=today).for_user(foo)
class CustomQuerySetManager(models.Manager):
    def get_query_set(self):
        return self.model.QuerySet(self.model)
    def __getattr__(self, attr, *args):
        try:
            return getattr(self.__class__, attr, *args)
        except AttributeError:
            return getattr(self.get_query_set(), attr, *args)


class Partyline(models.Model):
    ## Define fields, blah blah.
    objects = CustomQuerySetManager()
    class QuerySet(QuerySet):
        def sort_for_request(self, request):
            sort_field = request.REQUEST.get('sortby', 'did').strip()
            reverse_order = False
            if sort_field.startswith('-'):
                search = sort_field[1:]
            else:
                search = sort_field
                reverse_order = True

            # Check to see if the sort term is valid.
            if not (search in Partyline._meta.get_all_field_names()):
                sort_field = 'did'

            partylines = self.all().order_by(sort_field)
            if reverse_order:
                partylines.reverse()
            return partylines
        def for_user(self, user):
            if is_user_type(request.user, ['admin']):
                return self.all()
            else:
                ## Code from get_my_partylines goes here.
                return self.all() ## Temporary.

views.py :

def list_partylines(request):
    """
    List all `Partyline`s that we own.
    """
    partylines = Partylines.objects.for_user(request.user).sort_for_request(request)
2
ответ дан 3 September 2019 в 00:02
поделиться

В django.contrib.admin.views.main.ChangeList есть отличный пример того, как это делается в общем виде, хотя это гораздо больше, чем сортируя, вы можете просмотреть его код для некоторых подсказок и идей. Вы также можете посмотреть django.contrib.admin.options.ModelAdmin метод список изменений , в частности, чтобы получить больше контекста.

0
ответ дан 3 September 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: