Конспект лекции "Рынок рекрутмента"

В связи с ситуацией с возникшим вирусом, рынок труда начал серьезно оживать. Наблюдается просто огромный тренд на восстановление, но также наблюдается и вторая волна, а именно замедление. Это не является откатом или убыванием, просто тренд восстановления рынка замедлился. Например, сначала среднегодовые показатели по вакансиям на рынке труда были 24 процента, а после стали 2 процента. Но все же рост есть. Помимо этого, оптимизация по кадрам произошла практически по всем отраслям, кроме наиболее пострадавших, такими как туризм.

Также самое главное изменение на рынке является то, что компании стараются сохранить персонал любой ценой. Это обусловлено тем, что задачи бизнеса в России становятся все больше и больше, а количество людей, которые способны решать эти задачи остается такое же количество. Именно поэтому их не увольняют, а также из-за огромной конкуренции на них. Ведь, найти нового сотрудника будет достаточно тяжело, а если он и найдется, то его вовлечение в проект будет очень долгим и дорогим.

Кроме того, люди на рынке труда поделись на три группы: те, кого уволили, и они уже занимаются поиском новой работы; те, кто подозревает, что его в скором времени уволят, и они уже занимаются поиском новой работы; и самая большая группа – это те, кто замерли, кто не спешит принимать какой-либо выбор, они просто ждут.

Сам по себе рынок всегда был высококонкурентен, но из-за ситуации с вирусом эта конкуренция все больше и больше растет с весны. Но конкуренция – это здорово, потому что компании не расслабляются, появляется огромная почва для развития, придумываются новые идеи и так далее. Если говорить о продуктах и тенденциях ближайшего времени, то самым популярным является цифровой поиск соискателя, к которому можно подключить различное количество сервисов. Вторым, наиболее популярным, является умный поиск, суть которой заключается в том, что она без регистрации предлагает вакансию соискателю, ориентируясь на его действия, анализ поиска и желаний.

Абсолютно каждый бизнес ощущает внушительность затрат на найм одного сотрудника. В среднем это около 4000 рублей. Но в РФ сам по себе рекрутинг по стоимости очень низок, чем в Европе. Например, то, что у нас может стоит 100 долларов, там может стоить 1000. И найм всегда имеет тенденцию удорожания (особенно в условиях дефицита), потому что конкуренция уже идет на международном рынке из-за интернета, а не только на российском. И если компания хочет конкурировать, то надо инвестировать. Но можно и удешевить эту стоимость за счет ведения кадровых резервов, сотрудничества с университетами, открытия своих обучающих школ и так далее. Также, самыми востребованными навыки являются: самоорганизация, вливание в команду и самая важная - ответственность за свою работу.

Также, хочется сказать о том, что международный рынок труда акцентирует внимание на вакансию, а наш на резюме. Именно поэтому, очень важно вести свой сайт (тот, на котором Вы сейчас читаете мою статью). Потому что это будет являться как резюме и многие компании, которые сотрудничают с университетом могу вас заметить, а также это очень сильно поможет при трудоустройстве, потому что работодатели смогут посмотреть то, над чем вы работали.

Интернет-магазин на фреймворке Django. Часть 5.

Регистрация и авторизация пользователей

Следующим делом, я приступил к созданию процесса регистрации и авторизации пользователей. Для этого, я создал файл registration.html, который отвечал у меня за саму регистрацию. Кроме этого, через терминал было установлено django-crispy-forms. Что это такое? Django-crispy-forms - это приложение, позволяющее работать с формами Django, а также отображать их без написания лишнего кода и с минимальными установками, что очень упрощает работу. После того, как данное приложение было установлено, его необходимо подключить к форме и в установленные приложения. Подключение к странице я реализовал с помощью команды {% load crispy_forms_tags %} в файле registration.html. Ну а далее, я создал саму форму с методом POST. Сам код представлен ниже.

registration.html

Далее, нам необходимо добавить метод views и urls ссылку на страницу. Как это делается я показывал в предыдущих частях. Единственным моментом является то, что вначале нам необходимо подключить определенные библиотеки в urls.py для взаимодействия с методами регистрации, которые уже встроены в Django:from web import views as userViews и from django.contrib.auth import views as authViews, после чего добавляем сам метод регистрации во views.py. Но вначале, нам также необходимо подключить определенные библиотеки: messages (для отправки сообщений, уведомлений) и login_required (позволяет проверять находится ли пользователь в профиле или нет, чтобы не предлагать регистрацию или вход).

views.py

from django.contrib import messages
from django.contrib.auth.decorators import login_required
from .forms import UserOurRegistration

def register(request):
	if request.method == "POST":
		form = UserOurRegistration(request.POST);
		if form.is_valid():
			form.save()
			username = form.cleaned_data.get('username');
			return redirect('home')
	else:
		form = UserOurRegistration()
	return render(request, 'web/registration.html', {'form': form})

Помимо этого, в файле forms.py была написана сама форма регистрации и авторизации. Для этого мы импортируем библиотеку forms, таблицу зарегистрированных пользователей (User) и библиотеку для создания собственной формы UserCreationForm. После чего создаем форму.

forms.py

from django import forms
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class UserOurRegistration(UserCreationForm):
	email = forms.EmailField(required=True)

	class Meta:
		model = User
		fields = ['username','email', 'password1', 'password2']

Также была добавлена html страница и urls на страницу авторизации, если человек уже зарегистрирован, ну и кнопка выхода из профиля, которая перекидывала нас на начальную страницу.

urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from web import views as userViews
from django.contrib.auth import views as authViews
urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('web.urls') ),
    path('registration/', userViews.register,name="reg"),
    path('login/', authViews.LoginView.as_view(template_name='web/login.html'), name="login"),
    path('exit/', authViews.LogoutView.as_view(template_name='web/index.html'), name="exit"),
]

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

login.html


Реализация на сайте





Интернет-магазин на фреймворке Django. Часть 4.

Оформление заказа

После создания корзины, которая показывала, какие товары мы добавили, их цену и их количество, я приступил к реализации страницы оформления заказа, на которую мы уже переходили при нажатии на кнопку "Оформить заказ", расположенную в самой корзине. Как создавать страницу, я уже рассказывал в одной из предыдущих частей, на примере создания страницы товара и витрины. После того, как я создал страницу, там в ход пошла уже обычная верстка, а далее, я уже начал делать вывод товаров из корзины на нашу созданную страницу в виде таблицы. Для этого, в файле views.py я написал код, который у меня доставал все записи из модели "ProductInBasket", которая хранит все данные о товарах в корзине. Сама модель расположена в models.py. Также в файле checkout.html я сделал отрисовку полученных данных на самой странице. Но кроме вывода товаров из корзины, в данном файле была прописана также логика работы страницы, которая позволяла изменять количество товаров, считала стоимость по каждому товару и считала уже итоговую стоимость всего заказа в целом. Помимо этого, если у покупателя нету товаров в корзине, то при переходе на страницу, ему пишет "в корзине нет товаров".

Но это была проделана только половина работы. Основным этапом в данной части является написание back-end части, а именно, необходимо было, чтобы в Django-Admin Panel передавалась вся информация о заказчике, а также информация о самом заказе. И в ходе этой работы, была создана и мигрирована таблица в базу данных (как это делается я уже рассказывал в одной из части), куда, при нажатии на кнопку "Заказать", отправлялась вся информация о заказе и покупателе, а также дата его создания. Результат и сами коды, представлены ниже.

views.py

def checkout(request):
    session_key = request.session.session_key
    products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True)
    print (products_in_basket)
    for item in products_in_basket:
        print(item)


    form = CheckoutContactForm(request.POST or None)
    if request.POST:
        print(request.POST)
        if form.is_valid():
            print("yes")
            data = request.POST
            name = data.get("name", "3423453")
            phone = data["phone"]
            address = data["address"]
            email = data["email"]
            user, created = User.objects.get_or_create(username=phone, defaults={"first_name": name})

            order = Order.objects.create(user=user, customer_name=name, customer_phone=phone,customer_address=address,customer_email=email)

            for name, value in data.items():
                if name.startswith("product_in_basket_"):
                    product_in_basket_id = name.split("product_in_basket_")[1]
                    product_in_basket = ProductInBasket.objects.get(id=product_in_basket_id)
                    print(type(value))

                    product_in_basket.nmb = value
                    product_in_basket.order = order
                    product_in_basket.save(force_update=True)

                    ProductInOrder.objects.create(product=product_in_basket.product, nmb = product_in_basket.nmb,
                                                  price_per_item=product_in_basket.price_per_item,
                                                  total_price = product_in_basket.total_price,
                                                  order=order)

            return HttpResponseRedirect(request.META['HTTP_REFERER'])
        else:
            print("no")
    return render(request, 'web/checkout.html', locals())

forms.py

class CheckoutContactForm(forms.Form):
    name = forms.CharField(required=True)
    phone = forms.CharField(required=True)
    address = forms.CharField(required=True)
    email = forms.CharField(required=True)

checkout.html



Результат по checkout.html

Результат в Django-Admin Panel


Конспект лекции "Изнанка e-commerce"

Тренд развития интернет торговли в России, да и в мире в целом очень огромный, особенно из-за пандемии. Онлайн интернет-магазинов растет с каждым днем все больше и больше, поэтому они должны следить за трендами, ведь если они отстали от тренда, то рем стремительно падают вниз. Если говорить исключительно о России, то она не сильно отстает от всего мира по трендам, потому что работа происходим в интернете и все, что появляется в западном интернете, в скором времени будет и у нас. Так как онлайн растет с каждым днем, то все больше и больше компаний переходят в интернет торговлю, из-за чего происходит оттягивание клиентов у конкурентов. Но сама по себе аудитория растет, и она выбирает уже выбирает определенный магазин или тренд, отталкиваясь от своего эмоциональнольного паттерна.

На данный момент один из самых важных трендов в e-commerce — сохранить переход в онлайн. Но данный тренд не эффективен, так как нету у клиентов нету возможности пощупать и примерить товар. Поэтому, наилучший тренд — это работа в офлайн и онлайне, то есть использовать два канала трафика. На первом канале, человек сможет не только купить товар, но и посмотреть его, пощупать и так далее. А если товара не окажется в наличии, то просто пойти и заказать его в онлайн режиме.

Если человек решил войти в e-commerce, то он обязан подумать, какой товар ему продавать, а именно: провести глубокий анализ рынка, изучить тренды, новости. Но данный метод имеет погрешность, потому что эти данные могут стать неактуальными. В этом и есть плюс интернет-магазинов: быстро среагировав на ситуацию на рынке, мы можем моментально заменить ассортимент товаров.

Нужен ли бренд? Бренд обязательно нужен и развиваем мы его за счет умения выбрать и продать товар. При этом, при смене ситуации на рынке не нужно кардинально менять свою нишу, нужно всегда оставаться в одной сфере. Если же вы продаете товар такой ниши, которую сложно продать онлайн в той или иной ситуации, например, пандемия, то нужно искать какие-нибудь методы продажи. Например, предложить клиентам выгодную акцию, оформить предзаказ из-за ограниченной поставки и так далее.

Сегодня, лучше идти со своим товаром, но если его нет, то можно скопировать у конкурентов и добавить свою ценность. А если самому создавать товар, то будет шанс 50 на 50 о востребованности товара.

Основными ошибками при создании интернет-магазина – незнание что продавать, то есть люди зачастую сначала создают магазин, а потому уже думают, что продавать. Чтобы этого избежать, необходимо выполнять анализ рынка, что популярно, а что нет. Вторая ошибка – люди не разбираются в сфере, то есть как продавать товар. Чтобы избежать этого, необходимо глубоко изучить тематику или нанять специалистов.

Если говорить о ценовой конкурентности, то это мировая ценность и чем она выше, тем лучше. То есть, можно поднять цену, но для этого вы должны что-то дать, например, увеличить гарантию или организовать бесплатный сервис.

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

Маркетинговый бюджет при продвижении зависит от продаваемых товаров. Но среднем бюджет будет около 50-100 тыс.руб. Этих денег хватит для тестирования рекламы, нахождения первых клиентов и так далее. Также необходимо определиться, что делать своими руками, а что с помощью аутсорсинга. Например, какие товары продавать, создание описания к товару можно сделать самому, а запуск контекстной рекламы и рекламы в целом делать самостоятельно не стоит, потому что это очень долго и сложно.

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

Также существуют определенные признаки того, что проект будет неуспешным. Достаточно задать один вопрос: Почему надо покупать товар именно у вас? Если ответить на этот вопрос затрудняются, то создавать интернет-магазин не стоит. То есть, необходимы какие-то уникальные преимущества. Также, маркерами, что что-то идет не так, являются не окупаемость рекламы и низкая частота покупки.

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

Конспект лекции "Разработка ТЗ на сайт компании"

Разработка абсолютно любого сайта должна начинаться с технического задания. Что такое ТЗ в целом? ТЗ – это документ, который должен описывать структуру сайта, для кого он предназначен и какой функционал должен на нем присутствовать. При этом, в ходе его написания обязательно должен учувствовать заказчик, потому что без его участия не получится сделать качественный продукт.

Но как мы можем разрабатывать ТЗ и описывать в нем функционал, когда порой не могут сформулировать целеполагание по сайту? В целом, это нормальная история, и в этом нет никаких проблем. Дело в том, что сайт – это такой продукт, к которому сами требования формируются по ходу его разработки. То есть, большинство заказчиков понимает, как должно быть, только когда уже видят готовый результат. Именно поэтому в техническое задание необходимо вынести только критические какие-то вещи, ради которых сайт создается, а все остальное можно либо отнести на доработке, либо в процессе разработки, когда заказчик принимает в этом непосредственное участие.

Если говорить об основных ошибках при написании ТЗ, то они в основном типовые. Самая распространенная – набор хотелок, то есть, когда клиент хочет сайт как у конкурентов, только с перламутровыми пуговицами, и разработчик должен самостоятельно себе в голову это уложить, откуда-то добыть информацию, и на выходе получить готовый продукт. Чтобы этого избежать, заказчик должен максимально подробно отрисовать свой сайт в виде схемы, прописать какой контент есть для каждого раздела, что в каждом разделе должно происходить, а уже потом идти к разработчику.

Исходя из этой ошибки, невольно задаёшься вопросом, а именно: есть ли вообще смысл копировать сайт конкурента? Тут все зависит от выбранной стратегии. Например, если сайт успешный, есть инсайдерская информация, что он хорошо продает, то это нормально, а если скопировать сайт в том числе и аналогичный по дизайну, то это не есть хорошо, потому что потребитель не сможет отличить один магазин от другого.

Также, можно использовать сайт под ключ, что будет вполне себе хороший способ сэкономить для тех, кто на старте, но нужно понимать, что все равно на выходе получится полуфабрикат. И дальше вот этот полуфабрикат, который мы имеем на руках, нужно будет пойти и готовить самостоятельно для того, чтобы он стал работающим инструментом. А если говорить о лендинге, то невозможно сказать, что это плохо, потому что лендинг является прекрасным вариантом для того, чтобы протестировать какую-то гипотезу. И если эта гипотеза работает, то уже можно создать полноценный сайт. Но если компания не хочет использовать полноценный сайт, то она должна понимать, что лендинг слабо продвигается по SEO запросам. Исключением является момент, когда компания находится на небольшом региональном рынке, в узкой тематике, тогда, возможно, будет продвижение.

При разработке сайта, лучше взять в штат прораба, который будет способен внятно перевести хотелки заказчика и его выявить потребности. При этом, сказав цену заказчику, он может торговаться, но это должно быть обоснованно. А при приеме работы, в первую очередь необходимо обращать внимание на соответствие с ТЗ. Также необходимо заключать договор в целях безопасности, чтобы заказчик на половине процесса не исчез.

Интернет-магазин на фреймворке Django. Часть 3.

Создание корзины

Я уже говорил во второй части, что на странице товаров я создал кнопку покупки и поле для добавления количество товаров, поэтому этот момент в этом разделе опускаем. Сама корзина реализована с помощью jQuery. Что такое вообще jQuery? jQuery — набор функций JavaScript, фокусирующийся на взаимодействии JavaScript и HTML. Первым делом, мы подключаем jQuery к нашему проекту путем написания команды в static (в моем случае это файл main.html, в который мы подключали все файлы в первой части, а именно: Js,css и так далее). После этого, в папке js мы создаем файл scripts.js. В данном файле был прописан код, который позволяет добавлять и удалять товар из корзины. Помимо этого, он еще позволял показывать сколько было взято товаров, его название, цену. А также в файле views.py тоже был написан код, который позволял сохранять данные на стороне сервера. Сами коды представлены ниже.

scripts.js

$(document).ready(function(){
    var form = $('#form_buying_product');
    console.log(form);

    function basketUpdating(product_id, nmb, is_delete){
        var data = {};
        data.product_id = product_id;
        data.nmb = nmb;
         var csrf_token = $('#form_buying_product [name="csrfmiddlewaretoken"]').val();
         data["csrfmiddlewaretoken"] = csrf_token;

        if (is_delete){
            data["is_delete"] = true;
        }

         var url = form.attr("action");

        console.log(data)
         $.ajax({
             url: url,
             type: 'POST',
             data: data,
             cache: true,
             success: function (data) {
                 console.log("OK");
                 console.log(data.products_total_nmb);
                 if (data.products_total_nmb || data.products_total_nmb == 0){
                    $('#basket_total_nmb').text("("+data.products_total_nmb+")");
                     console.log(data.products);
                     $('.basket-items ul').html("");
                     $.each(data.products, function(k, v){
                        $('.basket-items ul').append('
  • '+ v.name+', ' + v.nmb + 'шт. ' + 'по ' + v.price_per_item + 'руб ' + 'x'+ '
  • '); }); } }, error: function(){ console.log("error") } }) } form.on('submit', function(e){ e.preventDefault(); console.log('123'); var nmb = $('#number').val(); console.log(nmb); var submit_btn = $('#submit_btn'); var product_id = submit_btn.data("product_id"); var name = submit_btn.data("name"); var price = submit_btn.data("price"); console.log(product_id ); console.log(name); basketUpdating(product_id, nmb, is_delete=false) }); function showingBasket(){ $('.basket-items').toggleClass('hidden'); }; $('.basket-container').on('click, hover',function(e){ e.preventDefault(); showingBasket(); }); $('.basket-container').mouseover(function(){ showingBasket(); }); $('.basket-container').mouseout(function(){ showingBasket(); }); $(document).on('click', '.delete-item', function(e){ e.preventDefault(); product_id = $(this).data("product_id") nmb = 0; basketUpdating(product_id, nmb, is_delete=true) }) function calculatingBasketAmount(){ var total_order_amount = 0; $('.total-product-in-basket-amount').each(function() { total_order_amount = total_order_amount + parseFloat($(this).text()); }); console.log(total_order_amount); $('#total_order_amount').text(total_order_amount.toFixed(2)); }; $(document).on('change', ".product-in-basket-nmb", function(){ var current_nmb = $(this).val(); console.log(current_nmb); var current_tr = $(this).closest('tr'); var current_price = parseFloat(current_tr.find('.product-price').text()).toFixed(2); console.log(current_price); var total_amount = parseFloat(current_nmb*current_price).toFixed(2); console.log(total_amount); current_tr.find('.total-product-in-basket-amount').text(total_amount); calculatingBasketAmount(); }); calculatingBasketAmount(); });

    views.py

    def basket_adding(request):
    	return_dict = dict()
    	session_key = request.session.session_key
    	data = request.POST
    	product_id = data.get("product_id")
    	nmb = data.get("nmb")
    	is_delete = data.get("is_delete")
    
    	if is_delete == 'true':
    		ProductInBasket.objects.filter(id=product_id).update(is_active=False)
    		
    	else:
    
    
    		new_product, created = ProductInBasket.objects.get_or_create(session_key=session_key, product_id=product_id,
                                                                         is_active=True, defaults={"nmb": nmb})
    		if not created:
    			new_product.nmb+= int(nmb)
    		new_product.save(force_update=True)
    	
    
    	products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True)
    	products_total_nmb = products_in_basket.count()
    	return_dict["products_total_nmb"] = products_total_nmb
        
       
    
    	return_dict["products"] = list()
    
    	for item in products_in_basket:
    		product_dict = dict()
    		product_dict["id"] = item.id
    		product_dict["name"] = item.product.name
    		product_dict["price_per_item"] = item.price_per_item
    		product_dict["nmb"] = item.nmb
    		return_dict["products"].append(product_dict)
    
    	return JsonResponse(return_dict)
    

    Помимо этого, была создана корзина в шапке сайта, при наведении на которую, она разворачивалась и там были показаны наши товары, а именно: название, цена за шт, количество, а также был крестик, позволяющий удалить товар из корзины. Также, я поработал с библиотекой Ajax. Ajax — подход к построению интерактивных пользовательских интерфейсов веб-приложений, заключающийся в «фоновом» обмене данными браузера с веб-сервером. То есть, я создал в Django-Admin Panel еще одну БД (как создавать БД я рассказывал ниже), в которой отображалась добавленные товары в корзине. И это как раз и было реализовано через Ajax. А для чего это нужно? Это нужно по большей части для анализа данных, какие товары добавляют больше всего, какие удаляют и тд. Итог выполнения представлен ниже.

    Как мы видим, в БД показывается ID товара, кол-во, цену за шт, итоговую цену, дату добавления и т.д. Помимо этого, мы видим, что в поле "Is active" стоит зеленая галочка. Это значит, что товар у человека до сих пор находится в корзине, а если товар удалить, то будет красный крестик. Но в ходе создания корзины, я столкнулся с очень серьезной проблемой, а именно: при обновлении страницы или переходе на другую товар пропадал из корзины. Эту проблему я решил с помощью context processors. context processors - это файл, который есть на всех страницах сайта. То есть, при перемещении по сайту, обновлении страницы, товары оставались в корзине и показывалось, сколько их там. Код контекстного процессора и результаты выполнения в целом представлены ниже.

    Код context processors

    from .models import ProductInBasket
    
    def getting_basket_info(request):
    
        session_key = request.session.session_key
        if not session_key:
            request.session["session_key"] = 123
            request.session.cycle_key()
    
        products_in_basket = ProductInBasket.objects.filter(session_key=session_key, is_active=True)
        products_total_nmb = products_in_basket.count()
    
        return locals()
    

    Итоговый результат реализации корзины

    Интернет-магазин на фреймворке Django. Часть 2.

    Сортировка товара

    Сделав витрину товаров на странице shop.html, которая открывалась сразу после нажатия на раздел магазин, я решил сделать сортировку всех этих товаров по категориям. Подключив скачанный шаблон, там были реализованы переключатели на странице, их я переименовал в нужные для меня названия: все товары, верхняя одежда, джинсы, обувь и очки. И саму сортировку я решил реализовать на этих переключателях, то есть при нажатии на верхнюю одежду у меня показывалась только верхняя одежда и так далее. Чтобы это реализовать, мы переходим в файл shop.html и прописываем метод {% for post in pr %} поверх всех наших категорий, который необходим для вывода всех вообще товаров. После этого, делаем сортировку по Availability с помощью команды {% if post.availability %}. Эта команда говорит нам о том, что если галочка стоит, то есть товар есть в наличии, то выводим этот товар, если нет, то нет. Далее, делаем проверку по указанной категории с помощью команды {% if post.group == "Outerwear" %}. Этот метод if говорит о том, что если товар соответствует категории верхней одежды, то он выводит этот товар. Но всего в работе у нас четыре категории товара, поэтому после блока верхней одежды у нас идет блок обуви. Чтобы была сортировка по обуви, перед блоком мы уже пишем команду {% elif post.group == "Shoes" %}. После обуви у нас идет джинсы, поэтому прописываем {% elif post.group == "Jeans" %} и самый последний блок - очки. Перед этим блоком мы просто указываем команду {% else %}, потому что он является последним. После чего мы прописываем команды: {% endif %} (завершает проверку по блоку), {% endif %} (завершает проверку по наличию товара) и {% endfor %} (завершает цикл for). В результате выполнения этих действий, мы получаем сортировку товара. Результат представлен внизу.

    Создание страницы товара

    Сделав вывод всех товаров на страницу, следующим этапом стало созданием страницы товаров, то есть, при нажатии на какой-нибудь товар, у нас открывается отдельная его страница, где будет его название, изображение, описание и цена. Для этого в файле urls.py я прописал следующую команду: path('shop/', views.product, name='product'). Она говорит о том, что ее название product и что она будет открывать товар со страницы shop в соответствии с его id. То есть, у меня в магазине у каждого товара есть номер и все информация будет выводиться в соответствии с этим номером. После этого, в файле views.py я прописал сам метод, который назывался product. Его код изображен внизу.

    def product (request, id):
    	product = Product.objects.get(pk=id)
    	context = {
    		'product': product
    	}
    
    	session_key = request.session.session_key
    	if not session_key:
    		request.session["session_key"]=123
    		request.session.cycle_key()
    		print(request.session.session_key)
    
    	return render (request,'web/product.html', context)
    

    Ну и последним этапом является создание самой html страницы (в моем случае - product.html). На этой странице сделана обычная верстка и вывод соответствующих полей из нашей БД. Кроме того, была создана кнопка "купить" и поле, для ввода количества товара, сколько мы хотим купить. Это пригодиться нам для реализации корзины и добавления товара в нее. Сам код и результат представлены внизу.

    Код product.html

    Результат

    Интернет-магазин на фреймворке Django. Часть 1.

    Первые шаги

    В ходе моего учебного процесса нам была поставлена задача о создании интернет-магазина на одном из двух фреймворков: Django или Flask. Поэтому, я решил, что попробую написать интернет-магазин мужской одежды на фреймворке Django.

    Конечно, первым делом мне необходимо установить Django, создать проект и все это дело настроить и подключить. Как это делается я уже рассказывал в предыдущей статье, поэтому я все сделал по аналогии, как и там. После того, как мой проект был готов к работе, я решил найти шаблон интернет-магазина и подключить его к своему проекту, потому что если его писать вручную, то это займет огромное количество времени. Найдя и скачав понравившийся мне шаблон, я скопировал из него все "css" файлы и вставил в свой проект, а именно: static/css. То же самое, я сделал и с js, contactform, fonts и img. Далее, я создал файл main.html, где подключил скопированные мною файлы с помощью команды {% load static %} в разделе "head". Я сделал это для того, чтобы все файлы, которые я подключил, были статичны на всех страницах, то есть будут фиксированными. А также была добавлена в этот файл шапка моего сайта, с нужными мне разделами, а именно: главная и магазин. Кроме этого, был создан файл index.html, в котором я с помощью команды {% extends 'web/main.html' %} взял уже подключенные мною настройки, то есть этот файл будет иметь те же настройки, что и main.html, а также будет статический зафиксирована шапка сайта, так как она тоже находится в этом файле. И это, в дальнейшем, я делал абсолютно с каждой страницей. Ну и также я скопировал из моего ранее скаченного шаблона весь тег body и вставил в этот файл. Далее, я просто занимался небольшой версткой и изменением информацией с картинками, подходящими для интернет-магазина. Единственный, но очень важный момент заключался в том, что у меня не работали кнопки в шапке, поэтому я создал ссылку на переход в нужные мне разделы, а именно в разделе urls.py прописал необходимые мне модули path с определенными названиями и создал сами методы в файле views.py с одноименными названиями. Например, я в urls.py создал path с названием "shop" и в файле views.py создал метод с названием "shop", который выполнял у меня открытие этой страницы (return render (request,'web/shop.html', context)) и уже в файле main.html я указал url ссылку на 'shop'. То есть, помимо этого, нам нужно еще создать html страницы, которые она будет открывать ( в моем случае, я создал shop.html на которой у меня будет отображаться весь товар) Благодаря этому, при нажатии на раздел магазин, у меня открывался сам магазин. С разделом "Главная" я сделал тоже самое, только при нажатии у меня открывался файл index.html (страница с основной информацией магазина). Получившиеся результаты представлены ниже.

    Создание супер пользователя для Django-Admin Panel и создание в ней первой БД

    Чтобы создать супер пользователя, то есть пользователя, который будет являться, так сказать "Администратором", и иметь свой логин и пароль в Django-Admin Panel и иметь доступ ко всем созданным БД в проекте и всем записям, которые находятся в этих БД, необходимо зайти в Windows PowerShell и прописать команды python manage.py migrate и python manage.py createsuperuser. После чего, появится форма для его создания, в которой мы вводим Username и Password, то есть логин и пароль. Причем огромным плюсом является то, что таких "Администраторов" может быть несколько, а не только один. Далее запускаем сервер и в командной строке пишем localhost:8000/admin/, где у нас появится наш Django-Admin Panel, в который мы вводим наши логины и пароли и входим. И в открывшемся окне, будут отображаться все наши дальнейшие созданные БД.

    Проделав эту манипуляцию, мы уже можем создавать наши БД. Что такое вообще БД? База данных — это организованная структура, предназначенная для хранения, изменения и обработки взаимосвязанной информации, преимущественно больших объемов. Для этого, мы переходим в файл model.py, где создаем модель, включающая в себя определенные поля и настройки для каждого поля. В моем случае, создается БД для добавления и удаления товара на сайте, поэтому я создал следующую модель.

    class Product(models.Model):
    	OUTERWEAR = 'Outerwear'
    	JEANS = 'Jeans'
    	SHOES = 'Shoes'
    	GLASSES = 'Glasses'
    
    	CHOISE_GROUP = {
    		(OUTERWEAR,'Outerwear'),
    		(JEANS,'Jeans'),
    		(SHOES,'Shoes'),
    		(GLASSES,'Glasses'),
    
    	}
    
    	name = models.CharField(max_length=100)
    	description = models.TextField()
    	price = models.IntegerField()
    	availability = models.BooleanField()
    	group = models.CharField(max_length=20,choices=CHOISE_GROUP,default=OUTERWEAR)
    	img = models.ImageField(default='no_image.jpg', upload_to='product_image')
    
    	def _str_(self):
    		return f'{self.name}'
    

    Далее, мы переходим в раздел admin.py и регистрируем созданную модель с помощью команды admin.site.register(Product), после чего делаем миграцию созданной таблицы. Для этого, заходим в Windows PowerShell и прописываем следующие команды: python manage.py makemigrations и python manage.py migrate. После чего, созданная мною модель товаров появится в Django-Admin Panel и я полноценно могу с ней работать, а именно: добавить товары на сайт. Результат представлен ниже.

    Но помимо того, чтобы добавить товар, необходимо еще его и вывести, чтобы он отображался не только в нашей БД, но и в самом магазине (в моем случае, я хочу, чтобы товары отображались в разделе "Магазин"). Для этого, переходим в файл views.py и прописываем следующую команду:"from web.models import Product", то есть мы импортируем нашу созданную таблицу Product из models.py. Далее, в созданном методе на открытие раздела магазин, пишем объект собирающий все строки нашей таблицы. Далее, создаем класс, в которую пишем название строки и присваиваем переменную product. После этого, в методе render, где указано название страницы, передаем сoзданный класс.

    def shop (request):
    	product = Product.objects.all()
    	context = {
    		'pr' : product
    	}
    	return render (request,'web/shop.html', context)
    

    После этого, настраиваем сам вывод, на странице shop.html. Например, в разделе "Верхняя одежда" и пишем:

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