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

Шаг 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=255)
    created = models.DateTimeField()
    active  = models.BooleanField()
    content = models.TextField()

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

# settings.py

INSTALLED_APPS = (
    # …
    'news',
)

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

python manage.py migrate

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

Шаг 2: Список статей

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

# urls.py

urlpatterns = [
    # по адресу «news/» в файле news/views.py выполнять функцию index
    url(r'^news/$', 'news.views.index'),

    # по адресу «news/view/1» в файле news/views.py выполнять функцию view
    url(r'^news/view/([\d]+)$', 'news.views.view', name='news_view'),
]

Параметр [\d]+ означает, что на этом месте может быть любое число. Скобки ([\d]+) означают, что содержимое скобок можно передавать коду через URL.

В файле 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 = get_object_or_404(News, id=id)
    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]