通过HTML模板将用户分配到django中的组,而不是通过admin

时间:2018-03-19 07:40:14

标签: python django django-models django-forms

我创建了一个django应用程序,用户可以通过SignUp Form注册。我创建了两个组Admin UsersStaff Users。当任何用户注册时,他没有被分配给任何组。我想创建一个网页,其中将显示所有用户,并且应该在用户名前面有一个下拉列表,这将允许登录用户(Admin User组的成员,我将此页面限制为仅Admin Users组)在可用组中选择组。简单来说,组Admin User的任何成员都应该能够添加未分配给任何组的任何其他成员。我需要一个关于views.py和HTML页面应该是什么样子的基本帮助。

1 个答案:

答案 0 :(得分:2)

不久前我做了类似的事情。 这是模型,形式和视图。询问是否有任何不清楚。

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