Ответы пользователя по тегу Django
  • Как настроить 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. Все спасибо. Вопрос закрыт.
    Ответ написан
    Комментировать
  • Как в 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 комментария
  • Как в 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. Если её раскомментировать, то пользователь будет добавлен сразу в две группы. Т.о. можно добавлять пользователей сразу в несколько групп (если в этом есть необходимость). Естественно нужно понимать, что подобное добавление в группу можно делать не только при регистрации, но видя этот код, сделать необходимое решение уже не должно составлять большого труда.

    Надеюсь код пригодиться людям.
    Ответ написан
    Комментировать
  • При установке 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)
    А зачем оно тогда вообще нужно?
    Ответ написан
    Комментировать