自定义Django管理员:由于字段呈现,无法将用户分配到组



我目前正在开发一个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表并添加保存的用户实例。这样做之后,你的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)  

最新更新