注册/注册表单提交后自动将用户分配给用户组 - Django

时间:2017-11-21 09:35:34

标签: django django-forms django-users django-permissions usergroups

我对Django和网络开发相对较新。我试图建立一个包含两类用户,客户和供应商的网站。我需要能够在网站上向这两类客户展示不同的东西。例如,供应商标题部分中的不同链接。

我认为最好的方法是在我的/ admin中创建两个用户组('供应商''客户'),创建两个不同的注册表单(一个供应商,一个供客户使用),并在注册表单提交时将每个发送给各自的用户组。从那里我可以根据用户组决定用户看到了什么。正确的吗?

不幸的是,我几乎以我的智慧结束了!我创建了用户组,创建了不同的注册表单,但在过去的两天里,我一直试图找出如何将注册信息发送到各自的组,我无法设法做到了!我已经搜索过高低,并尝试了我能找到的每一段建议代码:没有运气。

我尝试过的大部分内容都是按照以下方式进行的:

views.py

    from __future__ import unicode_literals

    from django.contrib.auth import (
        authenticate,
        get_user_model,
        login,
        logout,
        )

    from django.contrib.auth.models import User, Group

    from django.contrib.auth.decorators import login_required

    from django.http import HttpResponse, HttpResponseRedirect

    from django.shortcuts import redirect, render, get_object_or_404

    from .forms import SupplierRegisterForm


    def supplier_signup_view(request):

        form = SupplierRegisterForm(request.POST or None) 
        if form.is_valid():
            user = form.save(commit=False)
            user.groups.add(Group.objects.get(name='suppliers'))
            password = form.cleaned_data.get('password')
            user.set_password(password)
            user.save()
            new_user = authenticate(username=user.username, password=password)
            login(request, new_user)
            if next:
                return redirect(next)
            return redirect("/")

        context = {
            "form": form,
            "title": title,
        }

        return render (request, "supplier_signup.html", context)

forms.py

    from django import forms
    from django.contrib.auth import (
        authenticate,
        get_user_model,
        login,
        logout,
        )
    from django.contrib.auth.models import User, Group

    User = get_user_model()

    class SupplierRegisterForm(forms.ModelForm):
        username = forms.CharField()
        email = forms.EmailField(label="Email Address")
        email2 = forms.EmailField(label="Confirm Email", widget=forms.TextInput(attrs={'autocomplete':'false'}))
        password = forms.CharField(widget=forms.PasswordInput)
        class Meta:
            model = User
            fields = [
                'username',
                'email',
                'email2',
                'password',
            ]

        def clean_email2(self):
            email = self.cleaned_data.get('email')
            email2 = self.cleaned_data.get('email2')
            if email != email2:
                raise forms.ValidationError("Emails must match")

            email_qs = User.objects.filter(email=email)
                if email_qs.exists():
                raise forms.ValidationError("This email has already been registered")

            return email                  

如果有人能给我一个初学者的演练,我将非常感谢如何在表单提交时自动将用户发送给用户组。请包括我需要使用的所有代码,无论是在settings,urls.py,models.py,forms.py,views.py还是模板(包括导入等),以及我需要执行的任何命令以及何时(例如迁移)。

非常感谢!

1 个答案:

答案 0 :(得分:0)

编辑:我已经改变了使用Django API的答案。

PlaterTest <- structure(list(Wells = c("A01", "A02", "A03"), `Amino acid position` = c("D46", "blank", "blank"), Mutant = c("A", "Y", "R"), Fluorescence = c(456L, 856L, 356L)), .Names = c("Wells", "Amino acid position", "Mutant", "Fluorescence"), row.names = c("1", "2", "3"), class = c("tbl_df", "tbl", "data.frame")) 之后致电user.save_m2m()

user.save()

解释(来自Django docs):

  

如果您的模型具有多对多关系,并且在保存表单时指定if form.is_valid(): ... user.save() user.save_m2m() ... ,则Django无法立即保存多对多关系的表单数据。这是因为在实例存在于数据库中之前,无法为实例保存多对多数据。

     

要解决此问题,每次使用commit=False保存表单时,Django都会向commit=False子类添加save_m2m()方法。在您手动保存表单生成的实例后,您可以调用ModelForm来保存多对多表单数据。