Django Модель. Команди. Адмінка.

Основи Python и Django. -> Django модель.

Django Модель.

Модель є набол Python класів, успадкованих від базового класу Django, та описують структуру майбутніх таблиць та їх зв’язків.

Модель описується у файлах models.py вашої програми.

Створимо три класи таблиць із категоріями новинами та коментарями у фалі main/models.py.

from django.db import models

# Create your models here.

class Category(models.Model):
    name = models.CharField(max_length=250)

class News(models.Model):
    title = models.CharField(max_length=250)
    text = models.TextField()
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    image = models.ImageField(null=True, blank=True)

class Comment(models.Model): 
    text = models.TextField()
    author = models.CharField(max_length=250)
    news = models.ForeignKey(News, on_delete=models.CASCADE)

У цих класах кожна змінна є полем таблиці з його налаштуваннями (типом, значенням за умовчанням і т.д.)

Після створення цих класів потрібно створити міграцію.

Міграція – це спеціальний скрипт, який змінює базу даних.

Створення міграції.

./manage.py makemigrations

Застосування міграції.

./manage.py migrate

У результаті маємо створитися 3 таблиці.

main_category

main_news

main_comment

django model

Основи Python и Django. -> Django.Команди.

slug: py-tmux name: . meta_title: Робота з MySQL meta_keywords: Робота з MySQL meta_description: Робота с MySQL is_active: true desc: |

files:

-
    file:     'django-model.md'
    title: 'Django модель.'
    meta_title: 'Django модель.'
    meta_description:   'Django модель.'
    meta_keywords: 'django model'
    desc:


-
    file:     'django-command.md'
    title: 'Django. Команды.'
    meta_title: 'Django. Команды.'
    meta_description:   'Django. Команды.'
    meta_keywords: 'django command'
    desc:

-
    file:     'django-admin.md'
    title: 'Django. Адмін інтерфейс.
     meta_title: 'Django. Адмін інтерфейс.
     meta_description: 'Django. Адмін інтерфейс.
    meta_keywords: 'django admin'
    desc:
Основи Python и Django. -> Домашнее задание.

Адмін інтерфейс. Домашнє завдання.

Створити модель та адмін-інтервейс наступних 3-х таблиць.

Категорії. Книги Автори.

Кожна книга має свою категорію та автора.

Поля для книги.

  • назва

  • короткий опис

  • рік випуску

  • зображення обкладинки

  • Логічний ознака опублікованості.

  • категорія

  • Автор.

Основи Python и Django. -> Django.Адмін інтерфейс.

ААдмін інтерфейс.

Додамо класи адмінки до main/admin.py

from django.contrib import admin

from .models import Category, News, Comment

# Register your models here.

class CategoryAdmin(admin.ModelAdmin):
    pass

admin.site.register(Category,CategoryAdmin)

class NewsAdmin(admin.ModelAdmin):
    pass

admin.site.register(News,NewsAdmin)

class CommentAdmin(admin.ModelAdmin):
    pass

admin.site.register(Comment,CommentAdmin)

django admin

Для того, щоб змінити заголовки посилань у списках, необхідно додати та описати метод str у класі моделі.

class Category(models.Model):
    name = models.CharField(max_length=250)

    def __str__(self):
        return self.name

Доступ до медіа-контенту.

Для того, щоб визначити каталог для зберігання зображень, що завантажуються, потрібно додати 2 змінні у налаштування settings.py.

MEDIA_ROOT = os.path.join(BASE_DIR, "media")

MEDIA_URL = '/media/'

Також необхідно додати роутинг для медіа-вмісту для DEBUG режиму у файлі urls.py.

from django.conf import settings
from django.conf.urls.static import static

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Далі, щоб визначити папку, для зберігання зображень, доповнимо поле image змінної upload_to.

class News(models.Model):
    ...
    image = models.ImageField(upload_to='news',null=True, blank=True)

Після цього зображення повинні завантажуватися в media/news і бути доступними для перегляду в браузері.

Приклад конфігурування адмін інтерфейсу з прикладу класу NewsAdmin.

class NewsAdmin(admin.ModelAdmin):
    list_display = ['title', 'text', 'category']
    list_filter = ['category']
    search_fields = ['title']
    list_editable = ['category']
    raw_id_fields = ['category']