---
# System prepended metadata

title: Тема 2. Приложение с несколькими страницами
tags: [Python Web]

---

---
tags: Python Web
---

# Тема 2. Приложение с несколькими страницами

https://github.com/roman-yatsenko/django-topics/tree/main/django-pages

## Начальная настройка

Как и в [теме 1](/@YaRo/python-web-topic01), наша первоначальная настройка включает в себя следующие шаги:

- создание нового каталога для нашего кода
- установить Django в новой виртуальной среде
- создание нового проекта Django 
- создание нового приложения pages
- обновление(настройка) settings.py

```shell
pipenv install Django==2.2.16
pipenv shell
django-admin startproject pages_project .
python manage.py startapp pages
```

### pages_project/settings.py

```python=
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'pages'
]
...
```

```shell
python manage.py runserver
# stop
mkdir templates
touch templates/home.html
```

### pages_project/settings.py

```python=
...
TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]
...
```

### templates/home.html

```html=
<h1>Homepage</h1>
```

## Class-Based Views

### pages/views.py

```python=
from django.views.generic import TemplateView


class HomePageView(TemplateView):
    template_name = 'home.html'
```

## URLs

### pages_project/urls.py

```python=
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('pages.urls'))
]
```

```shell
touch pages/urls.py
```

### pages/urls.py

```python=
from django.urls import path
from . import views

urlpatterns = [
    path('', views.HomePageView.as_view(), name='home'),
]
```

```shell
python manage.py runserver
# stop
```

## Страница About

```shell
touch templates/about.html
```

### templates/about.html

```html=
<h1>About page</h1>
```

### pages/views.py

```python=
...
class AboutPageView(TemplateView):
    template_name = 'about.html'
```

### pages/urls.py

```python=
...

urlpatterns = [
    path('', views.HomePageView.as_view(), name='home'),
    path('about/', views.AboutPageView.as_view(), name='about'),
]
```

```shell
python manage.py runserver
# stop
```

## Расширение Шаблонов

```shell
touch templates/base.html
```

### templates/base.html

```html
<header>
  <a href="{% url 'home' %}">Home</a> | <a href="{% url 'about' %}">About</a>
</header>

{% block content %}
{% endblock %}
```    

### templates/home.html

```html=
{% extends 'base.html' %}

{% block content %}
<h1>Homepage</h1>
{% endblock %}
```

### templates/about.html

```html=
{% extends 'base.html' %}

{% block content %}
<h1>About page</h1>
{% endblock %}
```

```shell
python manage.py runserver
# stop
```

## Тесты

### pages/tests.py

```python=
from django.test import SimpleTestCase

class SimpleTests(SimpleTestCase):
    def test_home_page_status_code(self):
        response = self.client.get('/')
        self.assertEqual(response.status_code, 200)

    def test_about_page_status_code(self):
        response = self.client.get('/about/')
        self.assertEqual(response.status_code, 200)
```

```shell
python manage.py test
# stop
```

---

(c) Яценко Р.Н., 2018-2020

[Учебный центр компьютерных технологий "Кит"](http://kit.kh.ua/)

<img src="https://i.imgur.com/Kh901c1.png" style="width: 150px; position: fixed; top: 100px; right: 10px; border: 0; box-shadow: none;">
