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

Какой язык нужно учить, чтобы зарабатывать сейчас больше

Какой язык нужно учить, чтобы зарабатывать сейчас больше

Конечно же все знают, что сотрудники практически любой компании хорошо владеющие иностранными языками и ценятся начальством больше, да и заработать могут поболее своих коллег — это не секрет. В связи с этим холдинг РБК недавно заказал популярному рекрутинг-ресурсу HeadHunter.ru провести исследование о том как знание иностранных языков повышает зарплатные ожидания у соискателей и ниже для читателей будут даны наиболее важная информация по этой теме.

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

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