31
Май
2020

Django, параметры в путях [закрыт]

Автотестер при проверке выдает: Ваш код работает, но не выполняет поставленное задание, либо делает что-то сверх задания. Попробуйте решить по-другому.

Укажите пожалуйста на ошибку у меня в коде?

Условия задачи:

В списке articles_list в articles/views.py хранится информация о статьях блога. Данные по каждой статье представлены списком вида: [id, имя_автора, год, название, [список_тегов]] .

У нас в urls.py нет path() для такого адреса

  • Допишите в urls.py правило, которое при запросе адресов вида {URL}/articles/tag/ вызовет функцию articles_by_tag() и передаст ей вторым аргументом переменную tag.
  • Допишите view-функцию articles_by_tag(), чтобы она:

    1) Приняла тег, по которому пользователь хочет получить подборку статей, как аргумент tag;

    2) Обошла в цикле список статей articles_list, нашла все статьи с нужным тегом и сложила их в список found_articles;

    3) Отправила список found_articles во вспомогательную функцию generate_html() для формирования HTML- кода возвращаемой страницы;

    4) Вернула пользователю HTML-код в виде HttpResponse.

urls.py:

from django.urls import path
from . import views
from accounts import views as acc_views
from articles import views as art_views

urlpatterns = [
    path('', views.index),
    path('accounts/sign-up', acc_views.sign_up),
    path('accounts/sign-in', acc_views.sign_in),
    path('accounts/my-account', acc_views.my_account),
    path('articles/dashboard', art_views.dashboard),
    path('articles/dashboard/<int:year>', art_views.dashboard),
    path('articles/<int:id>', art_views.article_by_id),
    # допишите ещё один путь

]

views.py:

from django.http import HttpResponse

articles_list = [
    [1, "Айви Яптанго", 2020, "Самые шикарные парочки знаменитостей 2019 года", ["красота", "гороскопы"]],
    [2, "Лео Месси", 2014, "Un Abrazo a Todos", ["лайфстайл", "недвижимость"]],
    [3, "Гэри Паска", 2016, "Продаётся дом в Южной Флориде за $2,695", ["недвижимость", "коучинг", "howto"]],
    [4, "Роби Тобинсон", 1967, "7 лет я применял этот трюк и назад пути нет", ["лайфхак", "коучинг", "howto"]],
    [5, "Металлий Вутко", 2017, "Let Me Speak From My Heart", ["футбол", "допинг"]],
    [6, "Роби Тобинсон", 1977, "Беспроигрышная древнеримская техника обольщения", ["отношения", "история", "howto"]],
    [7, "Роби Тобинсон", 2022, "3 способа установить девайс от храпа", ["здоровье", "коучинг", "howto"]],
    [8, "Роби Тобинсон", 1975, "Интимная проблема, которой втайне озабочены все ваши друзья", ["отношения", "здоровье", "howto"]],
    [9, "Elina Shake", 2008, "Представления, основанные на классах", ["python", "howto", "лайфхак"]],
    [10, "Бен Франклин", 1753, "Электрические стодолларовые купюры", ["фондовая биржа", "рынки", "электричество"]],
    [11, "Роби Тобинсон", 2012, "5 забавных Django Apps, о которых говорят все", ["django", "IT", "howto"]],
    [12, "Металлий Вутко", 2017, "No Problems, No Criminality", ["допинг", "недвижимость"]],
    [13, "Роби Тобинсон", 1987, "7 способов до смерти напугать своего босса в пятницу 13-го", ["работа", "мистика", "howto"]],
    [14, "Твентин Карантино", 2007, "Четыре сервера", ["кино", "django", "мистика"]],
]


# в функции generate_html()
# оформим перечень статей в виде html-списка
def generate_html(articles):
    if len(articles) == 0:
        return '<h1>По вашему запросу не найдено ни одной статьи!</h1>'
    else:
        base_html = '<h1>Статьи по вашему запросу:</h1> <ul>'
        for article in articles:
            list_item = f'<li><ul>' \
                        f'<li><strong>{article[3]}</strong></li>' \
                        f'<li>автор: {article[1]}</li>' \
                        f'<li>год: {article[2]}</li>' \
                        f'<li>теги: {", ".join(article[4])}</li>' \
                        f'</ul></li>'
            base_html += list_item
        base_html += '</ul>'
        return base_html


# на случай, если в адресе не указан год - установим значение year=-1
def dashboard(request, year=-1):
    found_articles = []
    if year == -1:
        # если в адресе не указан год,
        # записываем в found_articles все статьи нашего блога
        found_articles = articles_list
    else:
        for article in articles_list:
            if year == article[2]:
                found_articles.append(article)
    beautiful_html = generate_html(found_articles)
    return HttpResponse(beautiful_html)


def article_by_id(request, id):
    found_articles = []
    for article in articles_list:
        if id == article[0]:
            found_articles.append(article)
    beautiful_html = generate_html(found_articles)
    return HttpResponse(beautiful_html)


def articles_by_tag(request):  # добавьте второй параметр
    found_articles = []
    # код этой view-функции нужно дописать здесь
    ...
    beautiful_html = generate_html(found_articles)
    return HttpResponse(beautiful_html)

Мое решение:

urls.py:

path('articles/tag/<str:tag>', art_views.articles_by_tag)  

views.py:

def articles_by_tag(request, tag):
    found_articles = []
    for article in articles_list:
        if tag in article[4]:
            found_articles.append(article)
        return found_articles
    beautiful_html = generate_html(found_articles)
    return HttpResponse(beautiful_html)

Источник: https://ru.stackoverflow.com/questions/1134320/django-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-%D0%B2-%D0%BF%D1%83%D1%82%D1%8F%D1%85

Share

Тебе может это понравится...

1 Ответ

  1. Raid:

    def articles_by_tag(request, tag): # добавьте второй параметр
    found_articles = []
    # код этой view-функции нужно дописать здесь
    for articles in articles_list:
    if tag in articles[4]:
    found_articles.append(articles)
    beautiful_html = generate_html(found_articles)
    return HttpResponse(beautiful_html)