Есть ли способ использовать общие представления django и некоторые умные urlpatterns для быстрого упорядочения / сортировки запросов? - PullRequest
0 голосов
/ 04 января 2011

давайте предположим, что у меня есть модель django, подобная этой:

class Event(CommonSettings) :
    author      = models.ForeignKey(User)
    timestamp   = models.DateTimeField(auto_now_add=True)
    event_type  = models.ForeignKey(Event_Type, verbose_name="Event type")
    text_field  = models.TextField()
    flag_box    = models.BooleanField()
    time        = models.TimeField()
    date        = models.DateField()
    project  = models.ForeignKey(Project)

Теперь, по умолчанию, у меня есть представление, где я сортирую все события по времени и дате:

event_list = Event.objects.filter().order_by('-date', '-time')

однако, возможно, пользователь хочет отсортировать события только по времени, или по дате, или, возможно, в порядке возрастания, а не по убыванию.Я знаю, что могу создать шаблоны urlpattern, которые соответствуют всем этим случаям, и затем передать эти параметры на мой взгляд, однако я чувствую, что заново изобретаю колесо здесь.Административный сайт django может делать все это из коробки.

Итак, вот мой вопрос: есть ли умный, простой способ сделать это общим способом, или мне нужно жестко написать это длямои модели / виды / шаблоны?

и да, я нашел такие решения (https://gist.github.com/386835), но это означает, что вы используете три разных проекта для достижения одной цели - это кажется слишком сложным решением для такойпростая вещь.

EDIT1: как мне изменить шаблон, чтобы я мог комбинировать несколько фильтров? Сейчас у меня есть

<a href="?sort=desc">Desc</a>
<a href="?sort=asc">Asc</a> 

, но я хочуПозвольте пользователю также изменить количество отображаемых записей. Таким образом, у меня есть:

<a href="?order_by=date">order by date</a>
<a href="?order_by=name">order by name</a>

Это прекрасно работает, но если я нажимаю «упорядочить по дате», а затем нажимаю «Asc»,тогда мой ранее выбранный заказ исчезает. Это не то, что я хочу. Я хочу, чтобы пользователь мог комбинировать некоторые параметры, но не другие.

EDIT2: к сожалению, ваше решение не работает с

from django.views.generic.list_detail import object_list

and

paginate_by

.

Я пытался:

<a href="?sort={{sort_dir}}?page={{ page_obj.previous_page_number }}" class="prev">prev</a>
<a href="?sort={{sort_dir}}?page={{ page_obj.next_page_number }}" class="next">{% trans "next" %}</a>

, но тогда ссылки просто не работают (ничего не происходит).может быть, вам нужно сделать что-то особенное с "object_list"?

1 Ответ

1 голос
/ 04 января 2011

Я не думаю, что это так много работы, как вы ее себе представляете - вы можете использовать переменные вместо явного создания отдельных шаблонов URL. Если вы посмотрите, как администратор django справляется с этим, они привязывают переменные запроса к URL-адресу, например ?ot=asc&o=2 Это соответствует сортировке в порядке возрастания во втором столбце. Конечно, если вы разрабатываете определенную страницу, вы также можете использовать более удобочитаемое наименование. Поэтому вместо нумерации категорий я бы сделал ?sort=desc&order_by=date и затем поместил бы регулярное выражение в представление, чтобы соответствовать различным возможностям. Что-то вроде:

order = re.match(r"(?:date|time|name)$", request.GET['order_by'])
if request.GET['sort'] == 'desc':
    order = '-' + order
results = Event.objects.filter().order_by(order)

Вместо этого вы можете использовать регулярное выражение в качестве сопоставителя шаблона URL-адреса, как вы предлагали, но чаще всего сам URL-адрес представляет, на какой части сайта вы находитесь (т. Е. website.com/events/), а переменные запроса URL-адреса представляют, как этот контент отображается (т.е. ?order_by=date&sort=desc).

Надеюсь, это поможет!

РЕДАКТИРОВАТЬ: Для второй части вашего вопроса, используйте шаблонную систему Django (которая читает переменные) вместо просто HTML. Есть несколько способов сделать это в зависимости от личных предпочтений и от того, как именно вы хотите, чтобы функционировал пользовательский интерфейс (например, страница загружается с новыми переменными каждый раз, когда пользователь выбирает фильтр, или пользователь выбирает все параметры фильтра в форме и затем отправляет его, так что страница должна перезагрузиться только один раз и т. д.). В этом случае вы можете просто сделать:

<a href="?sort_by=asc&order_by={{order}}">Ascending</a>
<a href="?sort_by=desc&order_by={{order}}">Descending</a>

<a href="?sort_by={{sort}}&order_by=name">Name</a>
<a href="?sort_by={{sort}}&order_by=date">Date</a>

Затем в представлении убедитесь, что ваши аргументы render_to_response включают словарь, который выглядит следующим образом: {'order': request.GET['order_by'], 'sort': request.GET['sort_by'], }

К сожалению, (и кто-то, пожалуйста, исправьте меня, если я ошибаюсь) Я не думаю, что есть шаблонный тег для генерации URL с параметрами request.GET - тег URL {% url name_of_view order_by=name sort_by=desc %} будет генерировать "путь / к / name_of_view" / name / desc / ", но я не думаю, что есть тег для генерации" path / to / name_of_view? order_by = name & sort_by = desc ". Хотя было бы довольно легко написать собственный тег для этого (я не удивлюсь, если он уже есть на django-snippets или что-то в этом роде, хотя я просто сделал быстрый поиск в Google и ничего не нашел).

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