Как вывести статьи?
У меня в urls.py есть 2 адреса, первый со статьями, второй со списком всех этих статей. Вот код:
path('news',views.list_news,name = 'list_news'),
path('news/<int:article_id>', views.news, name = 'news'),
Вот их view:
def news(request,article_id):
try:
a = News.objects.get(id = article_id)
except:
raise Http404('Статьи не найдены')
return render(request,'articles/news.html',{'article': a})
def list_news(request):
title_elements = News.objects.all()
return render(request,'listnews.html',context = {'key_title':title_elements})
И в news у меня есть один шаблон в котором выводятся статьи,если в адресную строку ввести 1,то он выведет первую статью,2 - вторую и.тд И вот в списке ВСЕХ этих статей у меня выводится каждый их заголовок и кнопка для этой статьи и что мне надо будет прописать в form action = ? что бы меня пересылало к этим статьям,как бы на первой кнопке к 1 статье,на второй - ко второй статье(тоесть у меня ОДИН шаблон выводит все статьи,но к ним надо обращатся по цифрам)
Ответы (2 шт):
(Использовать формы вместо ссылок - плохая практика, не стоит злоупотреблять этим там, где оно не требуется)
В шаблоне listnews.html в цикле {% for new in key_title %}, где вы генерируете вид списка (почему здесь нет кода этого шаблона, кстати?), вам необходимо делать ссылку кнопочки вида {% url 'news' news.id %}.
То есть, у вас в path('news/<int:article_id>', ...) есть аргумент article_id, и джанга его требует для генерации ссылки.
https://docs.djangoproject.com/en/3.1/ref/templates/builtins/#url
Использовать форму для переадресации на статью не нужно! Можно просто в контекст вашего view со списком всех статей поместить переменную articles, которая будет хранить список статей. Вот пример view:
def articles(request):
articles = Model.objects.all()
return render(request,'list.html',context={'articles':articles
}
И в шаблоне сделать что-то типа того:
{% for a in articles %}
<a href={% url 'name' a.id %}>{{a}} - ссылка на статью</a>
{% endfor %}
name в ссылке - это псевдоним ссылки вашего url-a с детальным отображением статьи. к примеру вот:
path('list',views.articles,name='list'),
path('list/<int:article_id>',views.detail,name='detail')
В теге url первое мы казали адрес, куда будет вести эта ссылка, а второе это аргументы. Как видите во втором url-адресе у нас есть url-параметр article_id и так как у нас есть url-параметр нам нужно передать аргументы в теге url шаблона. a.id - в ссылку будет подставляться id каждой записи.