Архив метки: Django

Установка Django на CentOS 7, запуск и тестирование

В данной статье рассмотрим установку и запуск первого проекта в Django на ОС Centos7

Установка Django

Первым делом устанавливаем pip

yum install python-pip –y

Далее устанавливаем само Django. Но просто дать команду

pip install django

Не получится, вы получите ошибку Unsupported Python version

Дело в том,  что в Centos 7 при чистой установке установлен python 2.7. Тут два выхода, можно установить 3-й python, или установить более старую версию Django. Пойдем по пути наименьшего сопротивления и установим версию поддерживаемую python 2.7.  Переходим на сайт https://docs.djangoproject.com/en/2.1/faq/install/. И видим что для нашей версии питон подходит Django 1.11. Вот ее и установим

pip install Django==1.11

Теперь установка должна пройти без ошибок

Запуск проекта

Создадим наш первый проект. Переходим в директорию где у нас будут храниться сайты, например /var/www/html/

cd  /var/www/html/

Даем команду на создание проекта, например проект будет называться mysite, тогда команда будет

django-admin startproject mysite

посмотрим что создала эта команд команда

ls –R

mysite – корневой каталог нашего проекта

manage.py – файл для выполнения различных интерактивных команд для Django. Например запуск внутреннего web сервера. Полный список команд можно посмотреть набрав

python manage.py

В каталоге /mysite/mysite/ содержатся конфигурационные файлы.

Settings.py –файл с основными настройками сайта, такими как задание языка, временной зоны, параметров подключения к базе и т.д.

urls.py – настройки URL

wsgi.py –файл для работы с модулем wsgi, нужен для работы джанго в web серверах apache или nginx.

Тестирование работы Django

Проверим работу нашего приложения, для этого выполните команду

python manage.py runserver 0.0.0.0:8000

После чего наберите в строке браузера

http://<ip адрес вашего сервера>:8000

При первом запуске у вас скорее всего появится ошибка You may need to add u’ip сервера’ to ALLOWED_HOSTS

Поэтому останавливаем сервер ctr^Z. Открываем на редактирование файл settings.py и ищем параметр

ALLOWED_HOSTS = []

Вписываем в квадратные скобки ip адрес сервера, например

ALLOWED_HOSTS = [’10.10.10.10’]

Должно получится так

Снова запускаем сервер

python manage.py runserver 0.0.0.0:8000

И пытаемся подключиться на адрес http://10.10.10.10:8000/ . В итоге вы должны увидеть следующую страницу

Она говорит нам что Django успешно запущено и настроено.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

 



2018-11-22T12:54:07
Django

Сброс пароля на админку в django

Что делать если вы забали пароль от админки к django? Есть как минимум 2 решения проблемы.

Первое решение просто поменять пароль на root или другого суперпользователя, которого вы создали при создании базы данных. Для этого входим в manage.py shell

python manager.py shell

и набираем

>>>from django.contrib.auth.models import User

>>>user = User.objects.get( username='root')

>>>user.set_password(«password»)

>>>user.save()

Второй способ еще проще, он также пригодится если вы вместе с паролем забыли и логин от админки, в этом случае можно создать нового суперпользователя, для этого в терминале вводим

python manage.py createsuperuser

 И вводим новые данные.



2018-09-29T23:09:18
Django

Django. Отображение фотографий на HTML странице (часть 11)

Добавим теперь фотографии домов, для этого расширим модель. В файле models.py напишем:

photo = models.ImageField(«фотография», upload_to=»houses/photos», default=»», blank=True)

Мы создали поле house_photo, в котором будет храниться ссылка на изображение дома.

default =»» — значение по умолчанию, это пустая строка.
blank=True – говорит, что можно добавлять дом без фотографии.
upload_to=»houses/photos» — путь где будут храниться фотографии

Нажмем Ctrl+Alt+R – создадим миграцию

makemigrations houses
migrate houses

Возможно вы получите следующие ошибки

ERRORS:
houses.House.house_photo: (fields.E210) Cannot use ImageField because Pillow is not installed.
HINT: Get Pillow at https://pypi.python.org/pypi/Pillow or run command:
«pip install Pillow».

Для выполнения следующей миграции без ошибок, нам нужно установить библиотеку Pillow.
Pillow — это библиотека для работы с изображениями.

Выполним:

pip install Pillow

И снова мы можем увидеть следующие ошибки:

pip install pillow failed with error code 1
error for pip install Pillow on Ubuntu virtualenv
failed building wheel for Pillow

Для их исправления нужно выполнить следующие команды

sudo apt-get install python-dev
sudo apt-get install python3-dev
sudo apt-get install libjpeg8-dev zlib1g-dev

Теперь снова выполним команду и в этот раз должно все получиться:

pip install Pillow

Collecting Pillow
Using cached Pillow-3.2.0.zip
Building wheels for collected packages: Pillow
Running setup.py bdist_wheel for Pillow … done
Stored in directory: /home/vlad/.cache/pip/wheels/88/2d/ce/3ff4ae4e2b8600d1bde1cbde5dfcc6d8770222c38348fe9139
Successfully built Pillow
Installing collected packages: Pillow
Successfully installed Pillow-3.2.0

Снова выполним миграцию:

python manage.py makemigrations houses
python manage.py migrate houses

Теперь перейдем в settings.py и включим поддержку медиафайлов. Тоесть файлы, которые будем добавлять мы или наши клиенты через сайт.

Добавим переменную MEDIA_ROOT, которой присвоим «media»

os.path.join(BASE_DIR, «media»)

, то есть мы будем хранить файлы в папке «media», которая будет находится в папке проекта BASE_DIR

Также добавим переменную MEDIA_URL, которой присвоим строку «/media/»

MEDIA_URL — это адрес по которому пользователь сможет получить доступ к нашим медиа файлам.

Теперь перейдем в файл urls.py и импортируем в него функцию static

from django.conf.urls.static import static

А также импортируем настройки проекта:

from django.conf import settings

После, к urlpatterns прибавим функцию static()
Первым аргументом укажем settings.MEDIA_URL, а вторым именованный document_root=settings.MEDIA_ROOT

urlpatterns = [] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Переходим в админку, выбираем дом бюджет, теперь мы видим, что появилось новое поле Фотография, которое в отличии от других полей не выделено жирным, то есть оно не обязательно для заполнения. Добавим фото и нажмем сохранить. Фотография загрузится на сервер в папку houses/photos

Теперь в папке проекта должна появится папка media, внутри которой houses и photos, в соответствии со структурой upload_to

Выведем теперь фотографию на сайт. Откроем шаблон houses_list.html и напишем:

if, затем нажмем TAB, чтобы быстро создать инструкцию

{% if house.house_photo %}

{% endif %}

А в теле инструкции напишем:

img, затем нажмем TAB, чтобы быстро создать конструкцию

В скобках {{ }} добавим house.house_photo.url и house.house_name

Разберем код:

Мы добавили условие, если у дома есть фотография house.house_photo, то подставить в атрибут src=»» ссылку на неё {{ house.house_photo.url }}, а в атрибут alt=»» имя дома {{ house.house_name }}

Откроем сайт и посмотрим, фотография Бюджетного дома — теперь выводится.

Отлично!

Автор: Vladimir Semenovich

Django. Наполнение страницы данными (часть 10)

Наполним страницу данными, вернемся в views.py и импортируем модуль house

from .models import House

А затем внутри представления напишем:

houses = House.objects.all()

House.objects.all() — этой строкой мы создаем запрос к нашей базе данных с помощью ORM.
objects.all() — запрос на получение всех объектов

Теперь в переменной houses содержаться все дома, которые мы добавили через админку. Мы снова обошлись без SQL запросов к базе данных, что очень упрощает разработку.

Передадим дома в наш шаблон, для этого добавим в функцию render(), третий параметр словарь, в котором напишем {“houses”: houses}, теперь в нашем шаблоне доступны созданные нами объекты.

Перейдем в html файл, т.к. мы связали шаблон с представлениями через render(), то теперь можно кликнуть по значку напротив объявления функции.

Теперь в houses_list.html нам нужно вывести дома через переменную hoses, которую мы передали в шаблон. Для этого нужно воспользоваться языком шаблонов Django.
Язык шаблонов Django — это такой упрощенный язык, с помощью которого можно обращаться к python объектам внутри html файла, а также реализовывать простейшую логику вроде циклов и условий.

Напишем for и нажмем TAB, Pycharm создаст для нас конструкцию for и поместит в нее объект houses

Конструкция for заключается в фигурные скобки с % и имеет окончание {% endfor %}
Внутри конструкции нам доступен объект house, который отвечает за один единственный дом.

Напишем:

div>h2+div*2

и нажмем TAB, чтобы Pycharm быстро создал несколько HTML тэгов.

Добавим в двойных фигурных скобках:

{{ house.name }}
{{ house.price }}
{{ house.description }}

{% … %} — если фигурные скобки с % отвечают за синтаксические конструкции, как например в for, то с помощью двойных фигурных скобок {{ … }}, мы можем обращаться к Python объектам, в нашем случае к объекту house и сейчас мы выводим данные по нашему объекту в HTML.

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

Отлично!

Автор: Vladimir Semenovich

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