首页 > 解决方案 > Django在注册期间根据另一个字段中的选择将用户分配给组

问题描述

我想根据用户在用户注册字段的另一个字段中的选择自动将用户分配到一个组。我是 Django 新手,我不确定实现这一目标的最佳方法。

我想根据模型中“business_location_county”字段的选择来分配组。简单来说,组应该是组 id,其中组“forum_id”等于 business_location_county 选择的 id。组“forum_id”是添加到组模型的自定义列。

模型.py:

from django.contrib.auth.models import AbstractUser
from django.db import models
from machina.core.db.models import get_model
from django.db.models import Q
from django.contrib.auth.models import Group

Forum = get_model("forum", "Forum")

class CustomUser(AbstractUser):
    age = models.PositiveIntegerField(null=True, blank=True)
    business_location_state = models.ForeignKey(Forum, null=True,  on_delete=models.SET_NULL, limit_choices_to={"lft":1})
    business_location_county = models.ForeignKey(Forum, null=True, on_delete=models.SET_NULL, related_name='county', limit_choices_to=(~Q(lft__in = (1,2))))


Group.add_to_class('forum_id', models.PositiveIntegerField(null=True, blank=True))

视图.py:

from django.urls import reverse_lazy
from django.views.generic import CreateView
from .forms import CustomUserCreationForm
from .models import CustomUser
from django.shortcuts import render
from machina.core.db.models import get_model
from django.db.models import Q

Forum = get_model("forum", "Forum")


class SignUpView(CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('login')
    template_name = 'registration/signup.html'

def load_counties(request):
    parent_id = request.GET.get('business_location_state')
    counties = Forum.objects.filter(parent_id=parent_id).order_by('name')
    return render(request, 'hr/county_dropdown_list_options.html', {'counties': counties})

表格.py:

from django import forms
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from .models import CustomUser

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm):
        model = CustomUser
        fields = UserCreationForm.Meta.fields + ('username', 'email', 'age', 'business_location_state', 'business_location_county')

        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['business_location_county'].queryset = CustomUser.objects.none()




class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = CustomUser
        fields = ('username', 'email', 'age','business_location_state', 'business_location_county')

我正在尝试使用 post_save 信号来完成此操作。但是,在尝试将用户保存到组之前,我需要弄清楚如何获取 group id,其中 business_location_state id 等于 Group forum_id。

我尝试(不成功)将其添加到 models.py

from django.db.models.signals import (
    post_save
)

def user_addgroup_handler(sender, instance, created, *args, **kwargs):
    g = Group.objects.get(id, limit_choices_to=(Q(forum_id__in = CustomUser.business_location_county)))
    print (g)


post_save.connect(user_addgroup_handler, sender=CustomUser)

关于如何实现这一目标的任何建议?

标签: django

解决方案


在专家的帮助下,以下工作:

def user_addgroup_handler(sender, instance, created, *args, **kwargs):
    # g = Group.objects.get(id, limit_choices_to=(Q(forum_id__in = CustomUser.business_location_county)))
    # group = Group.objects.get(name=instance.business_location_county.name)

    # for g in CustomUser.objects.all():
    #     print(g.business_location_county_id)

    if created:
        # Get or create group
        new_group, created = Group.objects.get_or_create(
            name=instance.business_location_county.name, forum_id=instance.business_location_county.id)

        # add new group to user
        instance.groups.add(new_group)


post_save.connect(user_addgroup_handler, sender=CustomUser)

推荐阅读