Архив рубрики: Django

Django. Отображение данных на сайте (часть 9)

Для того чтобы показать наши дома на сайте, откроем views.py в нем мы будем хранить так называемые представления — это специальная функция, которая будет возвращать html-страницу в браузере.

В файл views.py добавим функцию houses_list, в которой зададим аргумент request.

def houses_list(request):
pass

Request — это запрос вашего посетителя, когда посетитель заходит на страницу сайта, то браузер формирует специальный запрос web-серверу, Django этот запрос обрабатывает и помещает его в специальный объект request. Затем Django вызывает, какое-то представления, например houses_list и передает в его запрос request, а после представление помещает html-страницу обратно в браузер.

Чтобы вернуть html-страницу ее нужно создать.

Добавим в папку houses, новую папку templates.
Templates — это простая папка, а не python пакет в ней __init__.py файл не нужен. В нутри templates добавим еще одну папку houses, как и имя нашего приложения, а уже в ней создадим houses_list.html и добавим текст в

«Дом у моря»

Затем вернемся в views.py

views.py

Как вы заметили имя представления article_list(request) совпадает с именем шаблона houses_list.html, который мы создали. Так делать не обязательно, но это хорошая практика, которая проще позволяет ориентироваться в коде.

Добавим в представление:

def houses_list(request):
return render(request, “houses/houses_list.html”)

Тоесть мы в функции houses_list, возвращаем отрендеренный шаблон houses_list.html

Дополнительно в функцию houses_list мы передаем запрос посетителя request

Теперь нам нужно связать нашу функцию представления с каким-то URL.

Перейдем в urls.py и импортируем в него наше представление:

from houses.views import houses_list

А в список urlpatterns скопируем строку из комментария и заменим views.home на houses_list

Первый параметр в функции url — это регулярное выражение, которое отвечает за путь на сайте

^ — это начало адреса
$ — это конец адреса
r’^s’ — все выражение соответствует главной странице

Когда посетитель перейдет на главную страницу сайта, Django сопоставит путь с регулярным выражением, т.к. путь будет соответствовать этой записи r’^s’, то Django запустит представление houses_list,

которое вернет отрендеренную html-страницу

Теперь откроем браузер и увидим нашу пустую страницу с заголовком дом у моря

Автор: Vladimir Semenovich

Django. Создание первой статьи (часть 8)

Создадим первую статью.

Для того чтобы исправить House object(название статьи), нужно в models.py создать метод __str__

def __str__(self):
    return self.house_name

Full Code:
class House(models.Model):
    house_name = models.CharField(«Название», max_length=200, default=»»)
    house_price = models.IntegerField(«Цена», default=0)
    house_description = models.TextField(«Описание», default=»»)

class Meta:
    verbose_name = «Дом»
    verbose_name_plural = «Дом»

def __str__(self):
    return self.house_name

Метод __str__ отвечает за имя объекта, в нашем случае за имя одного дома, мы также можем вернуть как какое либо поле модели, так и какую-нибудь форматированную строку

def __str__(self):
    return «Статья номер {}».format(self.id)

Добавим отображение дополнительных полей в админке

@admin.register(House)
class ArticleAdmin(admin.ModelAdmin):
    list_display = [«name», «price»]

Сейчас дома будут отображаются в том порядке, в котором мы их добавили, но хотелось бы их отсортировать, например по алфавиту, по цене, по дате

В файле models.py, в классе Meta добавим:

class Meta(object):
    ordering = [«name»]

Full code:
from django.db import models

# Create your models here.
class House(models.Model):
    house_name = models.CharField(«Название», max_length=200, default=»»)
    house_price = models.IntegerField(«Цена», default=0)
    house_description = models.TextField(«Описание», default=»»)

class Meta:
    verbose_name = «Дом»
    verbose_name_plural = «Дом»
    ordering = [«house_name», «house_price»]

def __str__(self):
    return self.house_name

Для настройки фильтрации данных статей используем list  и в admin.py добавим

list_filter = [«house_price»]

Full code:
from django.contrib import admin
from houses.models import House

@admin.register(House)
class AdminHouse(admin.ModelAdmin):
    list_display = [«house_name», «house_price»]
    list_filter = [«house_price»]

Автор: Vladimir Semenovich

Django. Панель администрирования (часть 7)

И так у нас есть Модель и Таблица, которая связана с этой моделью, теперь нужно заполнить эту таблицу данными для этого в Django есть встроенная админка, которую можно настроить в файле admin.py

Сначала импортируем модель House

from .models import House
либо
from houses.models import House

И свяжем админку с моделью с помощью декоратора
@admin.register(House)

Создадим класс AdminHouse, который наследуется от admin.ModelAdmin, в нем мы будем конфигурировать отображение нашей панели

class AdminHouse(admin.ModelAdmin):

      pass

Full code:
from django.contrib import admin
from .models import House

@admin.register(House)
class AdminHouse(admin.ModelAdmin):
      pass

Создадим пользователя, который будет иметь доступ к админке

CTRL+ALT+R

createsuperuser
или
(pyvenv) vlad@vs:~/pyvenv/sites/blog$ python manage.py createsuperuser

Теперь введем:

  • Имя: admin
  • Email: xxx@mail.ru
  • Pass: admin12345 (повторить 2 раза, не менее 8 символов)

Запускаем сервер:

  • (pyvenv) vlad@vs:~/pyvenv/sites/blog$ python manage.py runserver
  • Переходим: http://127.0.0.1:8000/admin
  • Если забыл пароль, то можно создать нового юзера
  • (pyvenv) vlad@vs:~/pyvenv/sites/blog$ python manage.py createsuperuser

В админке мы видим два приложения “HOUSES” и “Пользователи и Группы


Нажмем на Пользователи и выберем admin, добавим имя и фамилию

Нажмем сохранить.

Данные сохранились.


И так, сейчас наше приложение HOUSES на англ. языке, исправим.

Откроем файл apps.py в нутри папки houses, добавим внутри класса HousesConfig поле verbose_name со значением “дома

Python2
Если возникает ошибка:
SyntaxError: Non-ASCII character
(no encoding declared; see http://www.python.org/peps/pep-0263.html)

то нужно добавить строчку:
# -*- coding: utf-8 -*-

class HousesConfig(AppConfig):
      name = 'houses'
      verbose_name = «дома»

А затем в файле __init__.py, той же папки создадим переменную
default_app_config = “houses.apps.HousesConfig”

Перезапускаем сервер. Все получилось.

Осталось только переименовать модель, для этого откроем файл models.py и внутри класса House, создадим класс Meta содержащий два параметра:

verbose_name = “дом”
verbose_name_plural = “дома”

Full code:
class House(models.Model):
      house_name = models.CharField(«Название», max_length=200, default=»»)
      house_price = models.IntegerField(«Цена», default=0)
      house_description = models.TextField(«Описание», default=»»)

class Meta:
      verbose_name = «Дом»
      verbose_name_plural = «Дома»

Класс Meta() — содержит мета-информацию, то есть описательную информацию о модели, в нашем случае ее имя в единственном и мн. числе.

Также в нем можно задать имя таблицы:

db_table = «article»

Класс Meta() — включает в себя дополнительные свойства для нашей будущей таблицы. Мы не хотим, чтобы Django самостоятельно давал название нашей таблицы, по-этому мы описываем это в классе Meta.

Так как мы изменили модель, то выполним команду:

CTRL+ALT+R
makemigrations houses
migrate houses

или создадим инструкцию
(pyvenv) vlad@vs:~/pyvenv/sites/blog$ python manage.py makemigrations houses
Далее с помощью инструкции заполним нашу базу данных:
(pyvenv) vlad@vs:~/pyvenv/sites/blog$ python manage.py migrate houses

Обновим страницу

И приложение и модель теперь на русском языке

Автор: Vladimir Semenovich

Django. База данных и модели ( часть 6)

Реляционные базы данных

Django прекрасно работает и с MySQL, PostgreSQL, SQLite, Oracle — все это реляционные базы данных.

Реляционные — это значит relational, relation — отношения, в нашем случае отношения между таблицами в нашем случае.

В прошлом уроке мы создали простое Django приложение “houses” и подключили его к проекту. А сейчас начнем его настраивать и начнем с файла models.py, в котором мы определим структуру данных приложения.

models.py — отвечает за описание нашей будущей базы данных

Внутри его, создаем класс House унаследованный от models.Model

В терминах Django класс House называется моделью и модель House отвечает за конкретный дом, который мы будем продавать клиенту.

Начинаем заполнять нашу таблицу. Таблицы в ORM оформляются в виде классов.

class House(models.Model):
      pass

Наши дома имеют определенные характеристики вроде:

  • Цены
  • Площади
  • Материала изготовления

Эти характеристики задаются внутри модели и называются полями модели
(переменные — колонки базы данных)

Создадим заголовок, первую колонку
name = models.CharField(«название», max_length=200)
# CharField — подразумевает собой набор символов
# max_length=200 — максимальная длина символов в строке

Создадим еще одно поле price, во вторую колонку
price = models.IntegerField(«цена»)
# IntegerField — может принимать и хранить целые числа
# “цена” — русское название поля price

Добавим еще одно поле description типа TextField в третью колонку
# TextField — в отличии от CharField, может хранить тексты произвольной длинны (для больших массивов текстовой информации) и его не нужно ограничивать параметром max_lenght
descriptions = models.TextField(“описание”)

Дополнительно
# models.DateTimeField — используется для хранения даты публикации статьи, это формат хранения как времени так и даты
# models.DateField — хранит только дату
# models.IntegerField — хранит цифровые целочисленные значения

class Meta — включает в себя дополнительные свойства для нашей будущей таблицы.

Нас интересует название таблицы, мы не хотим, чтобы Django самостоятельно давал название нашей таблицы, по-этому мы описываем это в классе Meta. Его нужно поместить во внутрь класса House (sites -> dom_u_morya -> houses)

файл models.py

сlass House(models.Model):
      class Meta():
            db_table = «new_houses»

Более современные требования требует дополнительных параметров

class House(models.Model):
      house_name = models.CharField(«Название», max_length=200, default=«»)
      house_price = models.IntegerField(«Цена», default=0)
      house_description = models.TextField(«Описание», default=«»)

И так в нашей модели House есть три поля, которые описывают его структуру


Теперь нам нужно спроектировать модель и базу данных или иными словами создать таблицу в базе данных таблицу, которая будет соответствовать нашей модели. Django умеет работать с ра

Django. Подготовка среды разработки (часть 4)

Как активировать virtualenv в PyCharm?

Ссылка на статью от Jetbrains

Переходим по следующему пути:

File -> Settings -> Project Dom_u_morja -> Project Interpreter

  • Нажимаем на эту маленькую шестеренку cogwheel_framed возле поля проекта и выбираем опцию More…
  • Нажимаем на “+” затем Add Local и выбираем нужный интерпретатор

Проверяем заработал ли интерпретатор. Нажимаем кнопку Run, если не заработало, то нажимаем Run/Debug Configurations и делаем настройку следующим образом как на рисунке.

Pycharm Professional — как открыть базу данных SQLite?

Переходим по следующему пути:

View -> Tool Windows -> Database

Автор: Vladimir Semenovich

Django. Создание первого приложения (часть 5)

Мы создали минимальный проект Django, теперь давайте посмотрим на его структуру.

Сама папка dom_u_morja в которой находится наш проект это всего лишь контейнер, она не на что не влияет и мы можем смело ее переименовать.

manage.py — это python скрипт для управления нашим проектом. Мы уже использовали его когда:

1)запускали тестовый сервер из консоли:
python manage.py runserver

2)применяли первые миграции:
python manage.py migrate

Внутренняя папка dom_u_morja — это python пакет для нашего проекта, в ней мы видим несколько файлов:

__init.py__ — сообщает python, что каталог dom_u_morja нужно рассматривать как пакет, а не просто папку

settings.py — отвечает за настройки сайта

urls.py — мы можем задавать url пути проекта

wsgi.py — это специальный файл для web серверов, которые будут запускать сайт

И так у нас есть основа и ее нужно расширять

Django-сайт состоит из приложений (applications), каждое из которых выполняет какую-то работу. Это один из принципов DRY.
DRY — don't repeat yourself

Приложения:

  • Каталог продукции
  • Форум
  • Блог

Откроем settings.py и пролистаем вниз до списка:

INSTALLED_APPS = [
          ‘django.contrib.admin’, — отвечает за панель администрирования
          ‘django.contrib.auth’, — отвечает за авторизацию на сайте
]

В этом списке содержатся приложения, которые уже подключены к нашему проекту. Все они являются частью Django и без них было бы сложно создать сайт. Кроме встроенных в Django, мы можем создавать свои собственные приложения.

Нажмем: CTRL+ALT+R, откроется консоль для взаимодействия с Django,

введем startapp houses, нажмем Enter, приложение создано.
(ссылка на Running Tasks of manage.py Utility

или в терминале запускаем команду: python manage.py startapp [app_label]

Если приложение не видно в проекте, то нажмем правой кнопкой на корневой папке проекта и выберем Synchronize dom_u_morja, чтобы обновить данные

Каталог houses появился. Раскроем его, это тоже python пакет со своей структурой данных


Теперь подключаем приложение к проекту, для этого достаточно добавить houses в список INSTALLED_APPS


Готово, приложение подключено.

Автор: Vladimir Semenovich