自定义 Django 管理员:由于字段呈现而无法将用户分配给组
Custom Django admin: unable to assign users to a group because of field rendering
我目前正在开发一个 Django 应用程序,我在该应用程序上创建了一个自定义管理部分(我知道现有的默认管理部分,但无法使用它)。
网站的“管理员”应该能够 CRUD 用户并将他们分配到一个组(“管理员”或“经理”组)。
由于组字段的呈现,我在将 CRUD 用户分配给任一组时遇到困难。我必须突出显示我要将用户放入的组,但保存后用户未分配到所选组。我猜我必须将这个字段放在某种小部件中,但我找不到解决方案。
下面代码
forms.py
class AdminUserCreateForm(UserCreationForm):
"""UserCreateForm custom made class"""
class Meta:
""" Meta definitioon of UserCreateForm"""
model = User
fields = [
'username',
'last_name',
'first_name',
'password1',
'password2',
'email',
'is_staff',
'is_active',
'is_superuser',
'groups',
]
views.py(此处仅创建使用视图为例)
@group_required('Administrator')
def admin_create_user(request):
if request.method == "POST":
admin_user_create_form = AdminUserCreateForm(request.POST)
if admin_user_create_form.is_valid():
admin_user_create_form.save()
if request.user.groups.filter(name__in=['Administrator']).exists():
return redirect('admin_home')
else:
return redirect('manager_home')
else:
admin_user_create_form = AdminUserCreateForm()
context = {
'admin_user_create_form': admin_user_create_form,
}
return render(request,'admin_create_user.html', context)
模板
<!-- template admin_create_user.html -->
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% load has_group %}
{% block title %} (ADMIN) Create User {% endblock %}
{% block content %}
<form method ="post">
{% csrf_token %}
<p>{{admin_user_create_form|crispy}}</p>
<p><button type="submit" class="btn btn-primary">Create Users</button></p>
</form>
{% if request.user|has_group:"Administrator" %}
<a href="{% url 'admin_home' %}" class="btn btn-primary">BACK TO ADMINISTRATOR HOME</a>
{% else %}
<a href="{% url 'manager_home' %}" class="btn btn-primary">BACK TO MANAGER HOME</a>
{% endif %}
{% endblock %}
结果
group field
我认为您没有将用户添加到组中。为此,首先您必须导入组 table 并添加已保存的用户实例。这样做之后你的 views.py 应该是这样的
from django.contrib.auth.models import Group
@group_required('Administrator')
def admin_create_user(request):
if request.method == "POST":
admin_user_create_form = AdminUserCreateForm(request.POST)
if admin_user_create_form.is_valid():
group = request.POST.get('groups')
admin_user_create_form.save()
admin_user_create_form.groups.add(group) #group must be an instance of your group ie, admin/manager
if request.user.groups.filter(name__in=['Administrator']).exists():
return redirect('admin_home')
else:
return redirect('manager_home')
else:
admin_user_create_form = AdminUserCreateForm()
context = {
'admin_user_create_form': admin_user_create_form,
}
return render(request,'admin_create_user.html', context)
我目前正在开发一个 Django 应用程序,我在该应用程序上创建了一个自定义管理部分(我知道现有的默认管理部分,但无法使用它)。 网站的“管理员”应该能够 CRUD 用户并将他们分配到一个组(“管理员”或“经理”组)。 由于组字段的呈现,我在将 CRUD 用户分配给任一组时遇到困难。我必须突出显示我要将用户放入的组,但保存后用户未分配到所选组。我猜我必须将这个字段放在某种小部件中,但我找不到解决方案。
下面代码
forms.py
class AdminUserCreateForm(UserCreationForm):
"""UserCreateForm custom made class"""
class Meta:
""" Meta definitioon of UserCreateForm"""
model = User
fields = [
'username',
'last_name',
'first_name',
'password1',
'password2',
'email',
'is_staff',
'is_active',
'is_superuser',
'groups',
]
views.py(此处仅创建使用视图为例)
@group_required('Administrator')
def admin_create_user(request):
if request.method == "POST":
admin_user_create_form = AdminUserCreateForm(request.POST)
if admin_user_create_form.is_valid():
admin_user_create_form.save()
if request.user.groups.filter(name__in=['Administrator']).exists():
return redirect('admin_home')
else:
return redirect('manager_home')
else:
admin_user_create_form = AdminUserCreateForm()
context = {
'admin_user_create_form': admin_user_create_form,
}
return render(request,'admin_create_user.html', context)
模板
<!-- template admin_create_user.html -->
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% load has_group %}
{% block title %} (ADMIN) Create User {% endblock %}
{% block content %}
<form method ="post">
{% csrf_token %}
<p>{{admin_user_create_form|crispy}}</p>
<p><button type="submit" class="btn btn-primary">Create Users</button></p>
</form>
{% if request.user|has_group:"Administrator" %}
<a href="{% url 'admin_home' %}" class="btn btn-primary">BACK TO ADMINISTRATOR HOME</a>
{% else %}
<a href="{% url 'manager_home' %}" class="btn btn-primary">BACK TO MANAGER HOME</a>
{% endif %}
{% endblock %}
结果
group field
我认为您没有将用户添加到组中。为此,首先您必须导入组 table 并添加已保存的用户实例。这样做之后你的 views.py 应该是这样的
from django.contrib.auth.models import Group
@group_required('Administrator')
def admin_create_user(request):
if request.method == "POST":
admin_user_create_form = AdminUserCreateForm(request.POST)
if admin_user_create_form.is_valid():
group = request.POST.get('groups')
admin_user_create_form.save()
admin_user_create_form.groups.add(group) #group must be an instance of your group ie, admin/manager
if request.user.groups.filter(name__in=['Administrator']).exists():
return redirect('admin_home')
else:
return redirect('manager_home')
else:
admin_user_create_form = AdminUserCreateForm()
context = {
'admin_user_create_form': admin_user_create_form,
}
return render(request,'admin_create_user.html', context)