• При установке django выбивает ошибку что делать?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Дружище у меня было как-то такое, когда не верно установилось виртуальное окружение. Дело было на windows 7, да ещё и когда я проект создавал через PyCharm и он же (PyCharm) создавал виртуальное окружение. Так вот в строке терминала я видел (venv) user@user-pc:
    но когда вызывал pip freeze, то видел, что все модули подтягивались из глобальной версии python. И получается, я мол хочу установить Django, а он у меня в глобальное версии уже установлен и получался некий конфликт. Пришлось лезть в папку виртуального окружения и править activate.bat. Но это уже совсем другая история.

    Ответ заключается в том, чтобы ты выяснил, нет ли у тебя "пластилина слепленного" между глобальной версией питона и твоим виртуальным окружением (если оно конечно есть). И если он есть, то возможным решением будет исправление этого конфликта.
    Ответ написан
    Комментировать
  • Django: Как получить список только тех категорий, в которых присутствует товар?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Отправляю сюда ответ из своего же комментария. Метод через annotate.

    1. В модели Product изменить строчку, чтобы появился параметр related_name:
    category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name='p_category')


    2. Во views.py импортировать модуль Count:
    from django.db.models import Count

    3. Выполнить запрос таким образом:
    categories = Category.objects.annotate(one=Count('p_category')).filter(one__gt=0)


    Результат аналогичен. Скорость и нагрузка между методами не сравнивалась и не проверялась.
    Ответ написан
    Комментировать
  • Django: Как в модуле django-bootstrap3 (django-bootstrap4) закрашивать поле при ошибке?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    В общем нашёл интересный метод. Не скажу, что решение оптимальное, но оно выполняет свою задачу, хотя и является некоторыми "костылями" (на мой взгляд).
    Метод этот я назвал "Метод провоцирования ошибки, ну или назначения ошибки" :-). При этом (как мне кажется) этот метод будет работать во всех расширениях и в том числе и в чистом варианте Django.

    Суть в чём. Как бы говорим "а вот на этом поле ошибка". И бац всё срабатывает. Кстати вывод ошибки через raise вообще можно в этом случае отключить, а можно и оставить по желанию. В коде это всё выглядит очень просто. Вот так:
    def clean(self):
            username = self.cleaned_data['username']
            password = self.cleaned_data['password']
            password_check = self.cleaned_data['password_check']
    
            if User.objects.filter(username=username).exists():
                from django.forms.utils import ErrorList
                self._errors['username'] = ErrorList()
                self._errors['username'].append('Пожалуйста выберите другое имя пользователя, т.к. пользователь с таким логином уже зарегистрирован в системе!')
                # raise forms.ValidationError('Пользователь с данным логином уже зарегистрирован в системе!', code='user exists',)
    
            if password != password_check:
                from django.forms.utils import ErrorList
                self._errors['password'] = ErrorList()
                self._errors['password'].append(' ')
                self._errors['password_check'] = ErrorList()
                self._errors['password_check'].append('Вы ошиблись при вводе паролей, они не совпадают, введите повторно!')

    5ba79a5457a07845474039.png5ba79a810c0b3754369354.png

    И так можно какие угодно свои правила придумывать. Да, кстати стандартные правила тоже срабатывают.

    5ba79b1c5b278976234283.pngНо всё-таки, как я уже сказал, метод не совсем оптимален, поэтому ищутся и другие варианты решения.

    p.s. да кстати, поле не будет выделяться, если не прописать в append ничего. Поэтому я там ставил пробел.

    p.s.2
    Решение 2. На мой взгляд оптимальное.
    и вот тут как говорить "за спрос денег не берут". Я через гугл переводчик всё это дело спросил на гитхабе у разработчика дополнения django-bootstrap3. И какая же была моя радость, что ответили быстро и точно. Единственное, чего в нём нельзя (ну или я пока не нашёл), так это сразу использовать и POP-up сообщение с красной формой. Но это уже совсем для искушённых. А решение такое:
    def clean(self):
            username = self.cleaned_data['username']
            password = self.cleaned_data['password']
            password_check = self.cleaned_data['password_check']
    
            if User.objects.filter(username=username).exists():
                raise forms.ValidationError({'username':'Пожалуйста выберите другое имя пользователя, т.к. пользователь с таким логином уже зарегистрирован в системе!'}, code='user exists')
    
            if password != password_check:
                raise forms.ValidationError({'password': '',
                                             'password_check': 'Вы ошиблись при вводе паролей, они не совпадают, введите повторно!'}, code='passwords do not match',)


    кстати я не знаю вообще зачем вставлять code , но в документации зачем-то так требуют, ну я и вставил.
    Ответ написан
    Комментировать
  • Как добавить поле в существующую модель django?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Согласен с Павлом. А если по пунктам, то обычно новые поля добавляются с пол пинка. Это вот изменения названий моделей, там могут быть засады и нужно поплясать с бубном (я открывал базу и изменял названия таблиц)(да и то я думаю, что это особенности sqlite и с каким-нибудь MySql а тем паче PostgreSQL вообще всё прошло бы гладко), но в вашем случае нужно действительно смотреть на ошибки.
    С чем например сталкивался я.
    1. Например если поле обязательное, то (когда уже существуют записи) может заругаться, что необходимо какое-то значение. И тут можно прописать параметр default в новом поле.
    2. Ещё я как-то сталкивался с засадой, когда добавил модель единиц измерений и в другую существующую модель добавил зависимость (units = models.ForeignKey(Units, on_delete=models.PROTECT)) и вот тут кажется при makemigrations оно меня тоже что-то там спрашивало, но поглядев яндекс-гугл, я ввёл значение (оно требовало что-нибудь ввести) и всё получилось.


    Поэтому да, нужно смотреть в каждом конкретном случае. Главное не боятся. Кстати!!! Я ещё делаю вот такой финт ушами, как снимание дампа базы и потом его обратное заполнение. Это я делал для двух вещей. Во-первых для того, чтобы перейти с sqlite на PostgreSQL и не заполнять базу снова и для того, чтобы можно было через Bitbucket (или GitHub) переносить проект и базу в том числе.

    Сливаем базу так (в терминале):
    python manage.py dumpdata --indent=2 --exclude=contenttypes > datadump.json

    Потом меняем подключение (или переносим например на другой комп или делаем после создания новой базы)(пишем поочерёдно 3 команды):
    python manage.py makemigrations
    python manage.py migrate --run-syncdb
    python manage.py loaddata datadump.json
    Ответ написан
    Комментировать
  • Как правильно обработать urls в django?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Да всё ты правильно делал. В джанге второй всё даже проще. Со временем разберёшься, только попробуй (хоть оно и на английском) пусть даже с переводчиком (как и я) почитать официальную документацию по path. Ну а в твоём случае делается следующее:

    1. в файл urls.py (главный, тот который лежит в папке с названием твоего проекта) нужно импортировать модуль include. Обычно там уже модуль path импортирован, поэтому просто нужно добавить include, чтобы строчка выглядела так:
    from django.urls import path, include

    2. Соответственно ниже код у тебя должен быть подобного вида:
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include(learning_logs.urls), namespace='learning_logs'),
    ]

    namespace (да и name) даже и не знаю нужен ли вообще в данном случае, ибо это же у тебя главный urls.py и в своих шаблонах ты можешь просто использовать '/' (прямую косую черту)
    <a class="main" href="/">Главная</a>
    да и в шаблонах этот же критерий можно использовать даже в качестве условий:
    {% if not request.get_full_path == '/' %}
    (в данном случае, условие означает, если текущая страница не главная (корневая), (но get_full_path нужно написать самому.))

    3. А вот уже во-внутреннем urls.py (тот который лежит в папке твоего приложения learning_logs), я бы использовал уже параметр name=:
    from django.urls import path
    from . import views
    
    urlpatterns = [
       # и т.д. пишешшь више чем нижняя строка
        path('result/', views.result, name='result'),
        path('', views.index, name='index'),
    ]


    Это твой как бы для тебя. Хотя я бы для себя это всё написал в главном urls.py, если приложение не большое. И оно одно. Кроме того я не выполняю (from . import views), а делаю это явным образом (контролируя и дописывая нужное в процессе написания). Обычно у меня главный urls.py файл выглядит как-то так:
    from django.contrib import admin
    from django.urls import path, include
    # тут могут быть и другие импорты например для статических файлов
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('tst/', include('tst.urls')),
        path('', include('shop.urls')),
    ]

    а во внутренний файл уже выглядит следующим образом:
    from django.urls import path
    from django.views.generic import TemplateView
    from shop.views import (
        base_view,
        category_view,
        product_view,
        cart_view,
        add_to_cart_view,
        remove_from_cart_view,
        add_to_cart_js_view,
        remove_from_cart_js_view,
        change_item_qty_view,
        checkout_view,
        order_create_view,
        make_order_view,
    )
    
    urlpatterns = [
        path('category/<slug:slug>', category_view, name='category_detail'), # если нужно отправить в метод slug
        path('product/<slug:slug>', product_view, name='product_detail'), # тоже самое
        path('cart/', cart_view, name='cart_detail'),  # просто переходим
        path('add_to_cart/<int:pk>', add_to_cart_view, name='add_to_cart'), # если нужно отправить id ключа например
        path('add_to_cart_js/', add_to_cart_js_view, name='add_to_cart_js'),
        path('remove_from_cart/<slug:slug>', remove_from_cart_view, name='remove_from_cart'),  # снова slug
        path('remove_from_cart_js/', remove_from_cart_js_view, name='remove_from_cart_js'),
        path('change_item_qty/', change_item_qty_view, name='change_item_qty'),
        path('checkout/', checkout_view, name='checkout'),
        path('order/', order_create_view, name='create_order'),
        path('make_order/', make_order_view, name='make_order'),
        path('thank_you/', TemplateView.as_view(template_name='thank_you.html'), name='thank_you'), # вот тут даже класса во views.py не создаётся, а сразу напрямую отправляемся в шаблон (работает потому что импортирована функция вверху).
        path('', base_view, name='base'),
    ]


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

    p.s. и последнее:
    Но PowerShell кидает ошибку
    name 'learning_logs' is not defined

    И глушит сервер.


    у тебя всё называется одинаково и поэтому ты путаешься сам. Подумай над названиями. А по факту всё это произошло, из-за вот этого (см. жирным):
    path(r'', learning_logs.urls, namespace='learning_logs'),
    Потому что в данном случае Django пытается найти в views.py класс learning_logs и естественно его там не находит, вот и говорит тебе, что ёлки-маталки имя learning_logs не определено. (и правильно кстати говорит).
    Ответ написан
    Комментировать
  • Как сделать нужный порядок при отображении моделей в админке Django?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    В общем нашёл я функцию сортировки. Сортирует она в функции get_app_list класса AdminSite. Затем по указанию Pavel Denisov стал искать способы решения. Находил разные варианты, поэтому объединив получил следующий вариант. Все манипуляции происходят в файле admin.py.
    Тут сразу хочется сделать некое отступление, что при переназначении регистрации, из админки пропадают Пользователи и группы и поэтому их нужно туда зарегистрировать самостоятельно. Но обо всём по порядку.

    1. Делаем необходимый импорт:
    from django.contrib.admin import AdminSite
    from django.contrib.auth.models import Group, User
    from django.contrib.auth.admin import GroupAdmin, UserAdmin

    2. Определяем свой класс, наследуясь от AdminSite и в нём переписываем функцию. (в моём случае я просто закомментировал цикл сортировки):
    class MyAdminSite(AdminSite):
    
        def get_app_list(self, request):
            """
            Return a sorted list of all the installed apps that have been
            registered in this site.
            """
            app_dict = self._build_app_dict(request)
    
            # Sort the apps alphabetically.
            app_list = sorted(app_dict.values(), key=lambda x: x['name'].lower())
    
            # Sort the models alphabetically within each app.
            #for app in app_list:
            #    app['models'].sort(key=lambda x: x['name'])
    
            return app_list


    3. Подменяем admin.site своим собственным:
    admin.site = MyAdminSite()

    4. Регистрируем своим модели:
    # Register your models here.
    admin.site.register(TypeProfile)
    admin.site.register(TypeFacade) 
    admin.site.register(Price)
    admin.site.register(PaintColor)
    admin.site.register(PatinaColor)
    admin.site.register(Materials)
    admin.site.register(Category)
    admin.site.register(Products)

    5. Регистрируем стандартные модели:
    #Регистрируем стандартные
    admin.site.register(Group, GroupAdmin)
    admin.site.register(User, UserAdmin)


    И всё работает как надо.
    Всем спасибо.
    Ответ написан
    2 комментария
  • Почему при установлении атрибутов width и height в поле модели ImageField выдается ошибка?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    А зачем оно тогда вообще нужно?
    Ответ написан
    Комментировать
  • Выбор slim клавиатуры в стиле лэптопа

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    После того, как стал быстро печатать, я себе тоже одно время не мог подобрать клавиатуру. Когда в добавок к десктопу прикупил компьютер Acer, был приятно удивлён удобными клавишами в этом ноутбуке. Решил купить что-то подобное. Денег не было на тот момент и теперь у меня на столе стоит Oklick 420M. В принципе я очень даже привык. Единственное, что не радует, так это нестандартное расположение END-DEL-HOME-секции, но как писал прежде, я привык. И вот недавно на али увидел интересную штучку. Буквально на днях. Вот теперь с сапы выдерну двадцатку и закажу.
    Ответ написан
    Комментировать
  • Как познать C++?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Внесу и я свою лепту.

    Всё зависит от того как ты вообще готов учиться.

    Поясню:

    Дело в том, что есть те, кто учится по книгам (и весьма успешно), а есть те, кому по ним тяжело и максимум они используют книги, как справочники.

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

    Но есть ещё метод «подмастерья». Т.е. когда устраиваешься на работу в какую-нибудь программерскую контору или студию чуть ли не забесплатно (по крайней мере в Ставрополе я знаю пару программеров, которые именно так начинали свою карьеру). Тем самым ты находишся в комманде опытных специалистов, с которых постигаешь опыт. За 3-5 лет сам вырастишь до мастера.
    Ну и во всех трёх случаях очень важно терпение.
    Ответ написан
    Комментировать