【问题标题】:Assign users to group in django via HTML template and not via admin通过 HTML 模板而不是通过管理员将用户分配到 django 中的组
【发布时间】:2018-03-19 07:40:13
【问题描述】:

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

【问题讨论】:

  • 如果您想进一步澄清问题,请询问

标签: python django django-models django-forms


【解决方案1】:

不久前我做了类似的事情。 这是模型、形式和视图。有什么不清楚的地方问一下。

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 }}

【讨论】:

  • 如果它解决了您的问题,请考虑接受它作为答案。谢谢
  • 很抱歉我现在才看到你的回答。抱歉延迟接受回答
  • 模板很简单。只需一个简单的{{ form.personnels }},django 就会使用selectmultiple 小部件呈现它,这样您就可以通过按住ctrl 并单击来选择多个personnel。如果您曾经使用过 django 表单,那么您应该复制其中的任何一个并替换表单字段。
  • 因此用户可以分配到下拉列表中选择的特定组?
  • 尝试学习 django 教程。帮了我很多
猜你喜欢
  • 1970-01-01
  • 2022-11-20
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多