Django 5 для начинающих

Прогресс по курсу:  9/1004

4.2 CRUD проект
4 из 12 шагов пройдено
0 из 60 баллов  получено

Задача 7

Задание:

Напишите функцию-представление, для приложения main_app, с именем sort_users, которая будет принимать параметры field и dir(поле и направление сортировки), и возвращать отсортированные записи из модели User.


Значение параметра field может быть только 'id', 'name', 'age'. Если параметр field не передан в представление или его значение иное, тогда необходимо выполнить сортировку по полю id.


Значение параметра dir может быть только 'up'(сортировать по возрастанию) или 'dn'(сортировать по убыванию). Если параметр dir не передан в представление или его значение иное, тогда необходимо выполнить сортировку по возрастанию.


В шаблон sort_users.html необходимо передать переменные user_data, sort_field, sort_dir:

В переменной user_data передаются отсортированные записи.

В переменной sort_field передаётся строка 'id' или 'имени' или 'возрасту', в зависимости от значения параметра field.

В переменной sort_dir передаётся строка 'возрастание' или 'убывание', в зависимости от значения параметра dir.


P.S. На экран ничего не нужно выводить, модель User необходимо импортировать из приложения main_app.

Код модели User:

class User(models.Model):
    name = models.CharField(max_length=50)
    age = models.IntegerField(default=18)
    phone = models.CharField(max_length=20)
    email = models.CharField(max_length=50)

 Код шаблона sort_users.html:

<h2>Список пользователей: сортировка по {{ sort_field }}, {{ sort_dir }}.</h2>
{% if user_data %}
    <p>Id, Имя, Возраст, Телефон, E-Mail</p>
    {% for user in user_data %}
        <p>{{ user.pk }}, {{ user.name }}, {{ user.age }}, {{ user.phone }}, {{ user.email }}</p>
    {% endfor %}
{% else %}
    <p>Записей нет</p>
{% endif %}
Чтобы решить это задание откройте https://stepik.org/lesson/1146718/step/12

Напишите программу. Тестируется через stdin → stdout

Верно решили 43 учащихся
Из всех попыток 12% верных
Time Limit: 30 секунд
Memory Limit: 256 MB
Максимум 15 баллов за решение.

Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Курс становится все лучше и лучше. 

крутое задание и раздел, набил руку малость

 

кстати тут переменная dir называется, насколько правильно называть переменные специальным словом?

Изменен Георгий Тимофеев

@Георгий_Тимофеев, лучше так не делать, хоть и это работает в данном случае.

Даже сами разработчики питона подобным грешат, например:

tempfile.TemporaryFile(mode='w+b', buffering=-1, encoding=None, newline=None, suffix=None, prefix=None, dir=None, *, errors=None)

https://docs.python.org/3/library/tempfile.html

Изменен Дмитрий Селезнев

@Георгий_Тимофеев, а в чем вы руку набили??? я чисто кроссворд  разгадывал в слепую,  автор даже отладку не подключил что усложняет написание такой просто проги в разы, приходится угадывать что автор загадал (((

@No_Name, интересно как вы представляете себе отладку?) У вас у каждого решения был вывод информации об ошибке. У последнего решения было видно, что у вас не правильно работает сортировка.

Вот я читаю условие, все по этапам написано, и вроде все понятно. Из 13 решивших, 5 человек решило с 1-3 попытки.

@No_Name, набил руку в использовании параметров, одно дело лекцию почитать, другое - самому повспоминать какие методы бывают, вернуться несколько раз к конспекту. Это всегда полезно. С такими проблемами как у вас не столкнулся.

Подскажите, пожалуйста, что делаю неправильно?

Решение вы видите?

@Павел_Кирсанов, в решении #1160953075 удалите строки:

field = User.objects.get('id', 'name', 'age')
dir = User.objects.get('up', 'dn') 

и добавьте значения по умолчанию в определение функции:

field='id', dir='up'

эти строки тоже можно удалить:

    else:
        field=field

    else:
        dir=dir

@Павел_Кирсанов, для решения #1160944024 достаточно добавить значения по умолчанию в определение функции.

@Павел_Кирсанов, f-строку не нужно было удалять в решении #1160997720, замените обратно '-field' на f'-{field}'

Изменен Дмитрий Селезнев

@Дмитрий_Селезнев, Спасибо! И еще пока не завернул field в сортировке в f-строку как переменную, выдавало ошибку, что передается строка "field". Почему так? Ведь переменная определена?

@Дмитрий_Селезнев, он и sorted_users = User.objects.order_by(field) не принимал, потому что принимал field за строку, а не за переменную

@Павел_Кирсанов, да, но так '-field', будет выведена эта строка, а не значение переменной field, тут или через f-строку сделать или конкатенацией строк '-'+field.

@Павел_Кирсанов,

он и sorted_users = User.objects.order_by(field) не принимал, потому что принимал field за строку, а не за переменную

посмотрите в опубликованных решениях решениях, #1161011907

AssertionError: sort_users() missing 2 required positional arguments: 'field' and 'dir'. Подскажите, что не так с моим последним решением...

@Александр_Ёлшин, должны быть значения по умолчанию для параметров field и dir.

@Дмитрий_Селезнев, хмм, до этого пытался им поставить значения в виде пустых строк, но была ошибка. Установил как в самой задаче "сказано", всё сработало, спасибо!

@Александр_Ёлшин, в решении #1149112194, при некорректных значениях переменной field не происходит задание для неё корректного значения. А после добавления этого кода, решение проходит.

[del code]
Изменен Дмитрий Селезнев