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']