• Как работает return и random.seed?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Итак для начала, хочу сказать, чтобы ты не задавал сразу два вопроса в одном вопросе (я понимаю, что каламбур, и именно поэтому так не делай).
    Итак во-первых:
    def get_regular_price():
      price = float(input("Bвeдитe обычную цену товара: "))
      return price

    Существует такая штука, как пространство имён.

    Вне функции переменной price не существует. И после исполнения (если ты не создашь эту переменную), то переменная price так же ниоткуда не появиться.

    Внутри же функции, переменная price появиться на время исполнения этой функции. И после исполнения, она передаст значение (именно значение, а не название переменной) и тут же "исчезнет". Но до, того пока ты не вызвал функцию, переменная price вообще ни в каком виде не существует.

    Можно использовать твою функцию и создать переменную с тем же названием в основном коде программы:
    price = get_regular_price()
    Но таким же способом можно и задать другое название переменной:
    stoimost354 = get_regular_price()

    По-второму вопросу, а именно про
    import random
    
    random.seed(10)
    print(random.randint(1, 100))

    Да, действительно, существует некая внутренняя реализация функции random. И случайность по умолчанию привязана к текущему времени. И да, действительно, можно указать число через инструкцию seed, которая вместо времени, будет за основу случайности брать, указанное тобой число. Но кроме "времени" или "числа" под капотом у функции есть ещё используемые в генерации параметры (если будет уместным назвать, то так называемая генерируемая "соль"). Посмотреть эти параметры можно если например в PyCharm сделать:
    import random
    и при помощи CTRL + Click на random, посмотреть исходник этой функции.
    Ответ написан
    1 комментарий
  • Как из массива удалить первый из нулевых элементов?

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

    list_ = [0,1,2,3,4,5,6,7,8]
    print(list_[1:])

    [1, 2, 3, 4, 5, 6, 7, 8]

    или ты что-то другое имел ввиду?
    Ответ написан
  • Как сделать такую конструкцию?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    pip install requests
    --------------------------
    import requests
    
    url = "site.com/file.txt"
    r = requests.get(url)
    text = r.text
    
    with open("file.txt", "w") as file:
        file.write(text)

    ты что-то такое имел ввиду?
    Ответ написан
    Комментировать
  • Virtualenv или Git?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    virtualenv - это отдельная комната, в которой у тебя находятся твои инструменты. Если ты программируешь например на python, то в этой комнате у тебя свой отдельный python, у него свои модули, свои файлы, которые ты создашь. Своего рода отдельная мастерская, которая изолирована от других производств. Там свои станки, свои материалы, свои работники (и такое может быть).

    git - это своего рода "сохранка изменений" + сравниватель "старой версии" с новой. Т.е. это система, которая следит за файлами, которые ты создал. Ты можешь возвращаться к старым сохранкам, делать ответвления от этих сохранок. И много других вещей. Для этого посмотри видео на ютубе. Кроме того, эти "сохранки" можно сохранять на удалённых репозиториях. В разных сервисах: bitbucket, github, gitlab и других на выбор. А ещё через такие удалённые сервисы, с одним и тем же кодом могут работать сразу несколько программистов. Вот такие чудеса... :-)
    Ответ написан
    1 комментарий
  • Как сдать сайт заказчику?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Я обычно пишу видео-ролик при помощи камтазии, бондикама или ещё чего-нибудь (что под рукой). Сразу же представляю, показываю особенности и выкладываю на ютуб с пометкой "смотреть могут те, у кого ссылка". Скидываю ссылку заказчику. Очень удобно и на телеге и на ватсап можно отправить.
    Заказчик видит, что работа выполнена. Либо платит и получает архив, либо говорит, что допилить. Я допиливаю, пишу дополнение (новый видео-ролик).

    Стараюсь, чтобы видео не занимало много времени. 3-10 минут. Сразу продумываю, как я его буду записывать, хотя через несколько раз уже легко получается и без какой-либо подготовки.

    Да, занимает время. Потому как в процессе пересмотра записанного видео, бывает сам замечаешь касяки. Ну по времени увеличиться твоя работа часа на 1.5-2, но зато это некая мера безопасности от кидка.
    Ответ написан
    Комментировать
  • Как заставить страницу открываться в той же вкладке браузера при нажатии кнопки формы Flask Forms POST?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Вот это обязательно???

    formtarget="{{url_for('wifi')}}" formmethod="post"

    Если в форме просто прописать

    <form action="" method="POST"  class="ordinary_form" id="wifi_form">


    а кнопку сделать такой:
    <input type="submit" value="SEND" onclick="loading();">


    Возможно решиться твой вопрос.

    Тут нужно понять, что у тебя выходит в результате вместо {{url_for('wifi')}}

    Вероятно в одном случае у тебя в этих данных какое-то значение, а в другом случае другое.
    Ответ написан
    1 комментарий
  • Как удалить теги в beautifulsoup? Или почистить найденный тег от внутренних тегов, оставив внетеговое содержимое?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    В общем нашёл сам, через суповский contents

    По сути концовка теперь стала такой:
    abz = []
            first_text = text.contents[0]
            abz.append(str(first_text).strip())
    
            for a in text.find_all("p"):
                abz.append(a.text.strip())


    но если кто-то знает решение проще, то пожалуйста напишите, я всегда рад изящным решениям.
    Ответ написан
    Комментировать
  • Как Экспортировать сайта с webflow?

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

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Итак перепробовав кучу вариантов, у меня получился один единственный. Сложно мне сказать почему именно он, но возможно это как-то связано с версиями самого Celery, потому что все решения, старше 2018 года просто не сработали у меня. В итоге я совместил пару решений (найденных на стековерфлоу), которые были предложены в 2018 и в 2019 году и наконец-таки у меня получилось.

    Итак файл settings.py . Вообще стал никак не задействован. В нём (если смотреть выше) была лишь настройка брокера. Она перекочевала в файл celery.py

    celery.py теперь стал выглядеть так:
    from kombu import Queue, Exchange, binding
    from celery import Celery
    
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'one.settings')
    
    # default_exchange = Exchange('default', type='direct')
    one_exchange = Exchange('one_go', type='direct')
    
    app = Celery('one', broker='amqp://localhost')
    app.conf.update(
            task_queues= (
                Queue('one_go', [binding(one_exchange, routing_key='one_go')]),
            )
    )
    
    app.conf.update(
            task_routes= {
                'plugin.email.tasks.send_email': {'queue': 'one_go'},
                'plugin.print.tasks.create_pdf_task': {'queue': 'one_go'},
                'plugin.print.tasks.create_pdf_from_site_task': {'queue': 'one_go'},
            }
    )
    app.autodiscover_tasks()


    ну а команда запуска находящаяся в файле
    one-celery.conf (для супервизора) начало которого теперь выглядит так:
    [program:one-celery]
    command=/home/iuser/djangoprojects/one/v_one/bin/celery worker -A one -l info -Q one_go


    Возможно что-то тут лишнее, может быть код избыточен, но работает именно так, как мне надо. Во второй "Джанге" всё так же, только вместо условного "one" везде прописано условное "two". Мучился над задачей с пятницы. Как говориться "не прошло и три дня". Всем спасибо.

    p.s. Даже и не знаю почему у меня не работает через настройки типа CELERY_QUEUES или CELERY_ROUTES. Возможно эти параметры упразднены в угоду тех конструкций, что я написал в этом сообщении выше.
    Ответ написан
    Комментировать
  • Как разбить новости по страницам?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Ответ написан
    Комментировать
  • Как в Django сохранить поля только дочерней модели, и не затрагивать поля родительской модели?

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

    Упрощённо ответив, решение будет таким:

    from profile.models import Client
    cli = Client(company = 'FST', discount=10.00, human_ptr_id=3)
    cli.save_base(raw = True)


    т.е. последняя строка как раз и делает то, что описано в вопросе. А вместо id пишем родитель_ptr_id. Все спасибо. Вопрос закрыт.
    Ответ написан
    Комментировать
  • Как можно ввести комментарий на одной строке после input?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    На сколько мне известно в терминале подобное не предусмотрено. Ну а если "концовку" вставлять в скобках?
    x= int(input("Введите вес (кг): "))
    w= int(input("Введите длину (мм): "))
    h= int(input("Введите высоту (мм): "))
    Ответ написан
  • Неужели до сих пор нет возможности вернуть событие focus (при его потери) в FireFox?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Короче порешал. Нашёл засаду в коде, а теперь по порядку.

    1. Обманка через setTimeout действительно работает. Т.е. код:
    setTimeout(function() {
      $('.element').focus();
      $('.element').select();
      }, 0);
    действительно рабочая обманка

    2. Но!
    в моём случае полный код был такой:
    $order.on('focusout', '.order-item-h', function () {
        ...
        setTimeout(function() {
          $(this).focus();
          $(this).select();
        }, 0);
        ...
    });
    и здесь я попадаю на долбаное "замыкание".
    Т.е. объект $(this) во внутренней функции setTimeout становиться undefined и код соответственно не отрабатывает.

    3. Чтобы исправить ситуацию, кладу $(this) в переменную и тогда всё срабатывает одинаково хорошо во всех браузерах (и в FireFox в том числе):
    $order.on('focusout', '.order-item-h', function () {
        ...
        $thi = $(this);
        setTimeout(function() {
          $($thi).focus();
          $($thi).select();
        }, 0);
        ...
    });

    Ура!
    Ответ написан
    Комментировать
  • Как сделать input text или textarea без переноса, но многострочные?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    Короче решил через js, так оказалось проще.
    <textarea type="text" class="md-textarea form-control border-top input-note" rows="2"></textarea>

    // запрет нажатия ENTER в поле ввода
                $('.input-note').on('keydown', function (e) {
                    if (e.keyCode === 13) {
                        e.preventDefault();
                        whenEnterPressed();
                    }
                });
    Ответ написан
    Комментировать
  • Как в Django шаблоне вывести в форме (в секции SELECT) через {% for, значения из ForeignKey?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    По совету, уважаемого Павла Денисова, я стал копать в предложенном им направлении. И в итоге пришёл к следующему варианту:
    <select class="mdb-select md-form" id="material" name="material">
        {% for material in form.material.field.choices.queryset %}
        <option value="{{ material.id }}">{{ material.title }}</option>
        {% endfor %}
    </select>


    Соответственно, если нужно по пути выбрать нужный вариант (если это не страница добавления, а к примеру страница правки), то добавляется ещё один if:
    <select class="mdb-select md-form" id="material" name="material">
        {% for material in form.material.field.choices.queryset %}
        <option value="{{ material.id }}"
        {% if material.id == modelpi.material.id %} selected="selected"{% endif %}
        >{{ material.title }}</option>
        {% endfor %}
    </select>

    Не забудьте "передать" модель (в примере это ModelPi) в шаблон.

    Кстати, обратив внимание на choices, я попробовал подобную конструкцию и с CHOICES.
    Чтобы не повторяться, покажу, как это сделать с radio button (радио переключателями)
    Делается похоже, но всё-же:
    {% for choice in form.type.field.choices %}
        <div class="form-check">
            <input type="radio"
    	             class="form-check-input my-change"
                   id="{{ form.type.name }}_{{ forloop.counter0 }}"
                   name="{{ form.type.name }}"
                   value="{{ choice.0 }}"{% if choice.0 == additionalproperty.type %} checked="checked"{% endif %}>
            <label class="form-check-label"
                   for="{{ form.type.name }}_{{ forloop.counter0 }}">{{ choice.1 }}</label>
       </div>
    {% endfor %}

    Не забудьте "передать" модель (в коде выше это AdditionalProperty) в шаблон.
    Ответ написан
    Комментировать
  • Можно ли использовать easy thumbnails в Django для уменьшения изображений сразу при их добавлении?

    JawsIk
    @JawsIk Автор вопроса
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    В принципе нашёл решение сам. Методом собирания целого из кусочков документации.

    Значит если по шагам.

    1. Установка

    2. В модели подключаем и описываем поле изображения похожим нижеприведённым способом:
    from easy_thumbnails.fields import ThumbnailerImageField
    
    class Category(models.Model):
        name = models.CharField(max_length=100)
        slug = models.SlugField(blank=True, max_length=100)
        # image = models.ImageField(default='img/my-default.gif') # а так было
        image = ThumbnailerImageField(default='img/my-default.gif', 
                                      resize_source=dict(quality=95, 
                                                         size=(2048, 2048), 
                                      sharpen=True))


    3. Делаем миграции. И оно работает.

    Работает по принципу "большей стороны". Т.е. если картинка 10000x5000 , то она станет 2048x1024 и наоборот, если второй параметр изначально был больше, то значит он и в итоговом изображении будет больше.
    Ответ написан
    2 комментария
  • Как изучать Python?

    JawsIk
    @JawsIk
    Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)
    На меня наверное все накинутся, но хуже чем документация Django я не встречал ещё ни разу.
    Да, я не знаю английского. Но я русский человек и сижу на русских порталах и форумах.
    Да, имея четверых детей, нет у меня возможности выучить английский, но даже имея перевод на русском, официальная документация Django отвратительная!!!
    Да, может быть я старый уже дядька и у меня, как я сам про себя говорю, однопроцессорная система в голове, но я считаю, что должно быть описание и тут же показана реализация с кодом и РЕЗУЛЬТОМ ВЫПОЛНЕНИЯ этого кода.
    В официальной же документации Django вы найдёте кучу всего в разных местах, всяких ссылок и описаний. Свойства в одном месте. Фильтры в другом. Аргументы в третьем, а в едином коде вам этого никогда не покажут. И вот когда вы уже подготовленный человек и знаете хотя бы половину из всего, то вам будет легко пользоваться этим, как справочником и то не факт.
    Очень часто вам нужна одна задача и она простая для понимания, а в официальной документации будет непонятно-неприменимый-к-реальности-пример, который вас запутает и отправит в Google. И тут нужно уметь искать по английски.
    Слава Богу, есть https://djbook.ru/ , да там версия 1.9, но по началу вы находите ответы именно там.
    И вот тут чем больше вы копаете, и разбираете чужого кода, тем больше вы понимаете что куда и как лепить. И тогда Django становиться реальным пластилином для быстрых поделок.
    Чтобы выйти на этот уровень новичку обязательно смотреть видео-уроки. Потому как если вы начнёте сейчас изучать английский, то до компьютерного английского вы доберётесь года через 2-3, а это значит вам нужно было задавать вопрос, как изучить всё это дело в 2021 году.
    А если сейчас, то обязательно к просмотру:
    djlesson : https://www.youtube.com/channel/UCbGrifMy8FAYpZ6wj...
    Олег Молчанов: https://www.youtube.com/user/zaemiel/featured?disa...
    Django School: https://www.youtube.com/channel/UC_hPYclmFCIENpMUH...
    Ну а дальше всё остальное, смотрите по Python целыми плейлистами.

    Я сейчас например смотрю очень много англоговорящих курсов. Балаболы срашные! Слава Богу, что я понимаю только отдельные слова. Но я смотрю код, который они кодят. И вот там нахожу порой удивительные решения.

    Но как я уже сказал, нужно несколько месяцев плотно посидеть, посоздавать какие-то проекты по тем же видео-урокам. Чтобы код не вызывал страха и вопроса "А чего это? и где это?".

    А максимум возгласы: "А почему так" или "Ух-ты, не дурно".

    Кроме того вы всегда можете почитать комментарии и сделать для себя выводы, почерпнуть дополнительные нюансы. (и английские комментарии можете переводить). Или даже задать вопрос самостоятельно автору того или иного ролика. Даже на английском (ведь Google Traslate есть). Только совет. Если задаёте вопрос, то разбивайте предложение на короткие.

    В общем плотный кодинг это самое верное средство для изучения. По 3-10 часов в день. И через 3 месяца у вас уже опыт около 500 часов кода на django.
    Ответ написан
    9 комментариев
  • Как изучать Базы Данных? С чего начать? Какой СУБД выбрать? Что читать? Где искать информацию?

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

    А по факту:
    1. Sqlite - подойдёт для изучения и для мелких проектов. Всё содержится в одном файле. Не позволяет сразу работать нескольким пользователям.
    2. MySQL - возможно глючная для каких-то очень больших проектов, но 90% всяких блогов, форумов, каталогов, магазинов и т.п. работает на ней и НЕ ГЛЮЧИТ. Т.е. ко всему нужно приложить руку и знания.
    3. PostgreSQL - возможно сложная, но эта штука чаще встречалась мне на питоновских проектах. Django (фреймоврк для построения сайтов написанный на Python и на котором сделан Instagram) очень любит эту базу. Но в Django есть ORM (это когда тебе вообще по боку какая база, ты просто даёшь команды, положить в базу, или извлечь из базы, а оно само выполняет нужные команды в зависимости от того к какой базе подключен.).
    4. Oracle DB - говорят стабильная. Сам не использовал. Но, говорят это мощь для больших корпораций.
    5. ....

    В итоге изучай MySQL и не парься. Этой технологии сто лет в обед. А зная её основы (всё про БД тебе просто на начальном этапе вообще не пригодиться), ты прекрасно будешь чувствовать себя и с простыми решениями (Sqlite) и с более продвинутыми PostgreSQL.

    Я MySQL запросами интересовался лет 10 назад. Сейчас пользуюсь и PostgreSQL и Sqlite и иногда MySQL и как-то не вижу прямо кардинальных каких-то различий. Ну тонкости, но не более. А вообще я всё чаще и чаще использую проекты с ORM.

    По поводу установки. Если винда, то у меня PostgreSQL ставиться гораздо быстрее, чем MySQL сервер. Можно ещё поставить всякие там пакеты для разработки поставить. Вот посмотри статья старая, но может чего там обновили и тебе оно как раз и нужно. XAMPP очень говорят популярен. А в моё время был Denwer.
    Ответ написан
    Комментировать
  • Как в Django определять админа, персонал, какую-то роль (которую определили в админке), как назначать свежезареганному пользователю роль?

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

    Вопрос 1: Опознавание ролей (групп) программно.
    В примере будет показан программный код метода account_view из файла views.py, который будет опознавать разные группы пользователей. Для примера в админке была создана группа manager. Ей не были даны специальные разрешения (permissions) и она служит лишь для декоративного разделения, но в программном коде даже такое декоративное разделение позволяет прекрасно опознавать и распределять пользователей. Так же прошу не обращать на функционал корзинки, здесь он оставлен только для того, чтобы показать на какой стадии нужно вставлять условия. Так же нужно понимать, что в каждом условии кроме имени шаблона могут быть (при необходимости) добавлены свои параметры, которые потом можно передать в шаблон.
    def account_view(request):
    
        cart = Cart()
        cart_id = cart.get_cart_id(request)
        items_in_cart = CartItems.objects.filter(cart_id=cart_id)
    
        # если не опознан, то дуй на страницу регистрирации
        if not request.user.is_authenticated:
            return HttpResponseRedirect(reverse('registration'))
    
        # если это суперпользователь
        if request.user.is_superuser:
            template = 'account_admin.html'
        # или если это пользователь с галочкой персонал, а так же принадлежащий группе manager
        elif request.user.is_staff and request.user.groups.filter(name='manager').exists():
            template = 'account_personal_role.html'
        # или если это просто пользователь с галочкой персонал
        elif request.user.is_staff:
            template = 'account_personal.html'
        # или если это пользователь принадлежащий группе manager
        elif request.user.groups.filter(name='manager').exists():
            template = 'account_role.html'
        # иначе все остальные (обычные пользователи)
        else:
            template = 'account.html'
    
        # сортировка выдачи заказов в обратном порядке (от последнего к первому)    
        list_orders = Order.objects.filter(user=request.user).order_by('-id')
        orders = OrderItems.add_order_info(request, list_orders)
    
        context = {
            'title': 'Кабинет пользователя',
            'orders': orders,
            'cart': items_in_cart,
            'total_cost': cart_id.total_cost,
        }
        return render(request, template, context=context)

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

    Вопрос 2: Программное добавление пользователей в группу (или в несколько сразу)
    Иногда бывает, что (например) при регистрации, нужно сразу добавить пользователя в определённую группу. Для примера была создана группа clients. Это чисто декоративное разделение. Группа не имеет никаких разрешений в админке, но выполняет свою задачу. Ниже представлен код метода registration_view из файла views.py , т.е. регистрации пользователя и этот новый пользователь после регистрации будет уже принадлежать группе clients. Кстати, чтобы код работал нужно выполнить необходимый импорт, это тоже в коде показано.
    ...
    from django.contrib.auth.models import Group
    ...
    
    def registration_view(request):
    
        # (предотвращаем заход по прямой ссылке)
        # если авторизован, то
        if request.user.is_authenticated:
            return HttpResponseRedirect(reverse('account'))
    
        form = RegistrationForm(request.POST or None)
        if form.is_valid():
            new_user = form.save(commit=False)
            new_user.username = form.cleaned_data['username']
            new_user.set_password(form.cleaned_data['password'])  # вот из-за этой бяки вся засада была у меня с паролями ЗАПОМНИ!!!!!!
            new_user.email = form.cleaned_data['email']
            new_user.first_name = form.cleaned_data['first_name']
            new_user.last_name = form.cleaned_data['last_name']
            new_user.save()
    
            # после собственно регистрации (сохранения нового) пользователя его можно добавить к группам
            new_user.groups.add(Group.objects.get(name='clients'))
    	# new_user.groups.add(Group.objects.get(name='manager'))  # и в ещё одну группу работает тоже
    
            login_user = authenticate(request, username=form.cleaned_data['username'], password=form.cleaned_data['password'])
            if login_user:
                login(request, login_user)
                return HttpResponseRedirect(reverse('account'))
    
        context = {
            'title': 'Регистрация',
            'form': form,
        }
        return render(request, 'registration.html', context)

    Как видно в коде после создания пользователя, он добавляется к (уже созданной предварительно) группе и теперь зайдя в админку, мы это можем легко проверить. Кроме того, в коде закомментирована строчка с добавлением в ещё одну группу manager. Если её раскомментировать, то пользователь будет добавлен сразу в две группы. Т.о. можно добавлять пользователей сразу в несколько групп (если в этом есть необходимость). Естественно нужно понимать, что подобное добавление в группу можно делать не только при регистрации, но видя этот код, сделать необходимое решение уже не должно составлять большого труда.

    Надеюсь код пригодиться людям.
    Ответ написан
    Комментировать