Вопрос: Как в Django определять админа, персонал, какую-то роль (которую определили в админке), как назначать свежезареганному пользователю роль?

Лучший ответ: Итак, как было в теме, я задавал два вопроса. Отвечу на них по порядку, чтобы людям сразу наглядно было понятно что сделать, чтобы получить результат. Очень меня печалит документация по 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 по default создаёт ещё таблицы permissions и groups.
Так же есть таблицы user_permissions, user_groups.
Ищите как их можно настроить.
get_group_permissions(obj=None)¶
Возвращает множество строк представляющие права пользователя добавленные с помощью групп.
Добавлено в Django 1.2.
Если указан obj, возвращает права только для указанного объекта.
get_all_permissions(obj=None)
Возвращает множество строк представляющие все права пользователя, с учетом групп.
Добавлено в Django 1.2.
Если указан obj, возвращает права только для указанного объекта.
request.user.get_all_permissions вроде так