Вывести список статей из базы данных

Шаг 1: Создание таблицы в базе данных

Сначала надо создать приложение «news».

python manage.py startapp news

Команда выше создаст папку «news» с необходимыми файлами.

В файле news/models.py надо создать модель, которая сгенерирует таблицу в базе данных.

# news/models.py
from django.db import models

class News(models.Model):
    title   = models.CharField(max_length=100)
    created = models.DateTimeField(auto_now_add=True)
    active  = models.BooleanField()
    content = models.TextField()

Параметр auto_now_add задаёт указанному полю значение по умолчанию текущую дату.

В файле settings.py в параметре INSTALLED_APPS надо добавить приложение «news» (создавалась через команду python manage.py startapp news).

# settings.py

INSTALLED_APPS = (
    # …
    'news',
)

В параметре INSTALLED_APPS указаны приложения, для которых будут созданы поля в базе данных. Чтобы создать сами поля, надо выполнить следующую команду:

python manage.py makemigrations
python manage.py migrate

Имя созданной таблицы будет иметь формат «приложение_модель», т.е. для текущего примера будет создана таблица news_news.

Шаг 2: Вывести список статей

В файле urls.py надо указать, какой код надо выполнять в зависимости от URL:

# urls.py
from news import views

urlpatterns = [
    # по адресу «news/» в файле news/views.py выполнять метод index
    path('news/', views.index),

    # по адресу «news/1» в файле news/views.py выполнять метод show
    path('news/<int:id>', views.show, name='news_show'),
]

В файле news/views.py надо написать код для каждого URL.

# news/views.py
from django.shortcuts import get_object_or_404, render
from news.models import News # импорт модели News из файла news/models.py

def index(request):
    news = News.objects.all()
    return render(request, "news/index.html", {"news": news})

def view(request, id):
    news = News.objects.get(id=id)         # 1-ый способ
    news = get_object_or_404(News, id=id)  # 2-ой способ
    return render(request, "news/view.html", {"news": news})

Функция get_object_or_404() выбирате указанную страницу. Если страницы нет, то выводит сообщение «страница не найдена».

Осталось только создать страницы шаблонов.

<!-- templates/news/index.html -->
{% for item in news %}
    <p><a href="{% url 'news_view' item.id %}">{{item.title}}</a></p>
{% endfor %}

<!-- templates/news/view.html -->
<h1>{{news.title}}</h1>
{{news.content}}

Параметр для {% url %} берётся из файла «urls.py», где имя шаблона для ссылки указан в параметр «name». Изменяя адрес страницы в «urls.py», он автоматически обновится на всех страницах через {% url %}.

При необходимости можно указать количество выводимых элементов через следующий код:

# выборка пяти новостей
news = News.objects.all()[:5]