【问题标题】:Django - How add a user to a group with Class Based ViewDjango - 如何使用基于类的视图将用户添加到组
【发布时间】:2021-06-24 12:26:05
【问题描述】:

我在尝试使用通用 CreateView 将用户添加到特定组时遇到了一些问题。 问题是我希望只有一个用户创建用户的帐户并将他分配到一个组 表单呈现正确,似乎选择了正确的组没有问题,但是当我检查用户没有分配任何组时。我尝试了很多我播种的方法,但任何一种似乎都适合我。

我不知道我应该在 (Post 方法)还是 form_valid() 中这样做 我使用 CreateView 但我不太擅长修改它自己的类, 请任何帮助

我使用默认用户,这是我的创建类

Views.py
class CreateUserView(LoginRequiredMixin, CreateView):
    model = User
    form_class = CustomUserForm
    template_name = 'accounts/create_user.html'
    queryset = User.objects.all()

    def get_success_url(self):
        return reverse_lazy('accounts:list_user')

    def post(self, request, *args, **kwargs):
        if self.request.method == 'POST':
            form = self.form_class(self.request.POST)
            if form.is_valid():
                self.object = form.save(commit=False)
                # form_class  = self.get_form_class()
                # form        = self.get_form(form_class)
                # position = int(request.POST['groups'])-1
                # self.object.groups.add(position)
                my_group = Group.objects.get(name="Usuario Avanzado")
                my_group.user_set.add(self.object)
                self.object.save()
                return HttpResponseRedirect(self.get_success_url())
        return HttpResponseRedirect(self.get_success_url())

请提供任何帮助,我将不胜感激

【问题讨论】:

    标签: django django-forms django-class-based-views


    【解决方案1】:

    参考这里。在此,每当创建新成员时,它都会将该成员分配给 Society 组

    def User_registration(sender,instance,created,**kwargs):
    
        if created:
            
            print('Created')
            
            member = Group.objects.get(name = 'Society') #Society is Group name
            instance.groups.add(member)
    
    
            
    
            print('Member created')
    
    post_save.connect(User_registration,sender=User)
    

    【讨论】:

    • 这个答案让我选择了信号来做它并且它工作但我怎么能不只是添加到“社会组”,而是从模板中传入一些输入字段
    • 谢谢我的朋友,我已经做到了,但我无法通过 CBV,我必须使用函数库
    • 我建议尝试使用代理模型而不是基于函数的视图。为每个组制作代理模型,并为他们制作信号。
    【解决方案2】:

    更多详情请访问:https://www.benlopatin.com/using-django-proxy-models/

    #主模型

    class SocietyUser(AbstractBaseUser,PermissionsMixin):
    
        class Types(models.TextChoices):
            MEMBER = "MEMBER", "Member"
            GATEKEEPER = "GATEKEEPER", "Gatekeeper"
    
        base_type = Types.MEMBER
    
        type = models.CharField(
            _("Type"), max_length=50, choices=Types.choices, default=base_type
        )
        society = models.ForeignKey(Society,null=True, blank =True,on_delete=models.CASCADE)
        society_user = models.CharField(max_length=200,unique=True)
        email = models.EmailField(_('email address'),unique=True)
        name = models.CharField(max_length=200,default=None)
        created_date = models.DateTimeField(default=timezone.now)
        
        is_staff = models.BooleanField(default=False)
        is_superuser = models.BooleanField(default=False)
        is_active = models.BooleanField(default=True)
    
        objects = CustomSocietyManager()
        USERNAME_FIELD = 'society_user'
        REQUIRED_FIELDS = ['society','name','email']
    
    
            
        def __str__(self):
            return self.society_user
    

    #ProxyModels

    class Member(SocietyUser):
    
      
        objects = MemberManager()
    
        class Meta:
            proxy = True
            permissions = (
                ('view_content', 'View content'),
                ('change_visitor', 'can change content'),
            )
    
    
    
    class Gatekeeper(SocietyUser):
    
       
        objects = GatekeeperManager()
    
        class Meta:
            proxy = True
    

    #信号

    def member_registration(sender,instance,created,**kwargs):
    
        if created:
            
            print('Created')
            
            member = Group.objects.get(name = 'Society')
            instance.groups.add(member)
    
          
            
    
            print('Member created')
    
    post_save.connect(member_registration,sender=Member)
    
    def gatekeeper_registration(sender,instance,created,**kwargs):
    
        if created:
            
            print('Created')
            
            gatekeeper = Group.objects.get(name = 'Gatekeeper')
            instance.groups.add(gatekeeper)
    
            
            
    
            print('Gatekeeper created')
    
    post_save.connect(gatekeeper_registration,sender=Gatekeeper)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 2019-08-29
      • 2022-09-28
      相关资源
      最近更新 更多