Skip to main content
 首页 » 编程设计

python之通过 HTML 模板而不是通过管理员将用户分配到 django 中的组

2024年09月07日37webabcd

我创建了一个 django 应用程序,用户可以在其中通过注册表单进行注册。我创建了两个组 Admin Users 和 Staff Users。当任何用户注册时,他不会被分配到任何组。我想创建一个网页,其中将显示所有用户,用户名前面应该有一个下拉菜单,让登录用户( Admin User 组的成员,我会将此页面限制为仅限 Admin Users 组)以在可用组中选择该组。简而言之,Admin User 组的任何成员都应该能够添加未分配到任何组的任何其他成员。我需要关于 views.py 和 HTML 页面应该是什么样子的基本帮助。

请您参考如下方法:

不久前我也做过类似的事情。 这是模型、表单和 View 。有什么不明白的就问。

from django import forms 
from django.db import models 
from django.shortcuts import redirect 
 
class Personnel(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 
    # other fields 
 
class AddPersonnelToGroupForm(forms.Form): 
    personnels = forms.ModelMultipleChoiceField( 
        queryset=Personnel.objects.all(), 
        widget=forms.SelectMultiple(attrs={"class" : "form-control select-multiple"})) 
 
def add_personnels_to_group(request, pk): # pk is group's pk 
    """Recursively add personnels to a group""" 
    template = "personnel/add_personnels_to_group.html" 
    group = Group.objects.get(pk=pk) 
 
    if request.method == "POST": 
        form = AddPersonnelToGroupForm(request.POST) 
        if form.is_valid(): 
            personnels = [Personnel.objects.get(pk=pk) for pk in request.POST.getlist("personnels", "")] 
 
            for personnel in personnels: 
                user = personnel.user 
                if user.groups.filter(id=group.id).count(): 
                    user.groups.remove(group) 
                else: 
                    user.groups.add(group) 
                    msg.append("{} added".format(personnel.display_name)) 
 
            return redirect(wherever) 
    else: 
        form = AddPersonnelToGroupForm() 
        return render(request, template, {"form" : form, "group" : group}) 

编辑

from django import forms 
from django.db import models 
from django.contrib.auth.models import Group 
from django.shortcuts import redirect 
 
class Personnel(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 
    # other fields 
 
class AddPersonnelToGroupForm(forms.Form): 
    personnels = forms.ModelMultipleChoiceField( 
        queryset=Personnel.objects.all(), 
        widget=forms.SelectMultiple(attrs={"class" : "form-control select-multiple"})) 
    group = forms.ModelChoiceField( 
        queryset=Group.objects.all(), 
        widget=forms.Select(attrs={"class" : "form-control select-multiple"}) 
    ) 
 
def add_personnels_to_group(request): # pk is group's pk 
    """Recursively add personnels to a group""" 
    template = "personnel/add_personnels_to_group.html" 
    # group = Group.objects.get(pk=pk) # replace this  
 
    if request.method == "POST": 
        form = AddPersonnelToGroupForm(request.POST) 
        if form.is_valid(): 
            group = form.cleaned_data['group'] # replacement 
            personnels = [Personnel.objects.get(pk=pk) for pk in request.POST.getlist("personnels", "")] 
 
            for personnel in personnels: 
                user = personnel.user 
                if user.groups.filter(id=group.id).count(): 
                    user.groups.remove(group) 
                else: 
                    user.groups.add(group) 
                    msg.append("{} added".format(personnel.display_name)) 
 
            return redirect(wherever) 
    else: 
        form = AddPersonnelToGroupForm() 
        return render(request, template, {"form" : form, "group" : group}) 

所以在你的表单模板中你需要有字段

{{ form.group }} 
{{ form.personnels }}