django - 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)
关于如何实现这一目标的任何建议?
解决方案
在专家的帮助下,以下工作:
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)
推荐阅读
- python - 气流弹性搜索钩子
- java - java - 如何在java的全局DbConnection中使用准备好的sql语句?
- c# - 搜索文件并删除它,不知道路径 C#
- r - 制作函数时保留列名
- javascript - 在 JS 中创建动画,但如果条件不运行
- go - 日志打印不同的输出
- visual-studio-code - 构建一个工具来利用语言服务器协议,特别是 VSCode 的 ~/.vscode/extensions 作为服务器启动机制
- java - 如何在 JSON 转换上使用 Mockito 编写 JUnit 测试?
- css - 我需要使用 Bootstrap 在 X 按钮和汉堡菜单之间切换。我正在使用 React.js
- python - IndexError:尝试循环遍历 python 列表时出现错误