---
# System prepended metadata

title: Тема 3. Приложение доска объявлений
tags: [Python Web]

---

---
tags: Python Web
---

# Тема 3. Приложение доска объявлений

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

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

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

### mb_project/settings.py

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

```shell
python manage.py migrate
python manage.py runserver
```

## Создание модели базы данных

### posts/models.py

```python=
from django.db import models

class Post(models.Model):

    text = models.TextField()
```

## Активация моделей

```shell
python manage.py makemigrations posts
python manage.py migrate posts
```

## Django Admin

```shell
python manage.py createsuperuser
python manage.py runserver
```

### localhost:8000/admin

### posts/admin.py

```python=
from django.contrib import admin

from .models import Post

admin.site.register(Post)
```

### Add new Post

### posts/models.py

```python=3
class Post(models.Model):

    text = models.TextField()

    def __str__(self):
        """Строковое отображение модели"""
        return self.text[:50]
```

## URLs

### posts/views.py

```python=
from django.views.generic import ListView
from .models import Post


class HomePageView(ListView):
    model = Post
    template_name = 'home.html'
```

```shell
mkdir templates
touch templates/home.html

```

### mb_project\settings.py

```python=55
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
...
```

### templates\home.html

```html=
<h1>Message board homepage</h1>
<ul>
  {% for post in object_list %}
    <li>{{ post }}</li>
  {% endfor %}
</ul>
```

### mb_project\urls.py

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

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

```shell
touch posts/urls.py
```

### posts\urls.py

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

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

```shell
python manage.py runserver
```

### Add more posts

## Tests

### posts\tests.py

```python=
from django.test import TestCase
from .models import Post


class PostModelTest(TestCase):

    def setUp(self):
        Post.objects.create(text='just a test')

    def test_text_content(self):
        post=Post.objects.get(id=1)
        expected_object_name = f'{post.text}'
        self.assertEqual(expected_object_name, 'just a test')
```

```shell
python manage.py test
```

### posts\tests.py

```python=2
from django.urls import reverse
```

```python=17
class HomePageViewTest(TestCase):

    def setUp(self):
        Post.objects.create(text='this is another test')

    def test_view_url_exists_at_proper_location(self):
        resp = self.client.get('/')
        self.assertEqual(resp.status_code, 200)

    def test_view_url_by_name(self):
        resp = self.client.get(reverse('home'))
        self.assertEqual(resp.status_code, 200)
        
    def test_view_uses_correct_template(self):
        resp = self.client.get(reverse('home'))
        self.assertEqual(resp.status_code, 200)
        self.assertTemplateUsed(resp, 'home.html')        
```

```shell
python manage.py test
```

---

(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;">
