Django注册表根据用户类型分两步

问题描述

我对 Django 很陌生,但现在我正在处理一个需要通用用户注册的项目,然后创建第二个表单以根据用户类型保存一些其他配置文件字段。我已经创建了这个:

模型.py

# Create your models here.
class User(AbstractBaseUser,PermissionsMixin):

    USER_CHOICES = (
        ('galerist','galERISTA'),('collector','COLLECTOR'),('artist','ARTISTA'),('curator','CURADOR'),('general','GENERAL'),('press','PRENSA')
    )

    username = models.CharField(max_length=20,unique=True)
    usertype = models.CharField(max_length = 20,choices = USER_CHOICES,default = 'normal') 
    image = models.ImageField(upload_to='media',blank=True,null=True)  
    email = models.EmailField()
    nombre = models.CharField(max_length=30,blank=True)
    apellidos = models.CharField(max_length=30,blank=True)
    telefono = models.CharField(max_length=12,blank=True)
    empresa = models.CharField(max_length=30,blank=True)
    direccion = models.CharField(max_length=100,blank=True)
    ciudad = models.CharField(max_length=15,blank=True)
    pais = models.CharField(max_length=20,blank=True)

    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

    USERNAME_FIELD =  'username'

    required_FIELDS = ['email']

    objects = UserManager()

    def get_type(self):
        return self.usertype

    def get_full_name(self):
        return self.nombre + ' ' + self.apellidos

    def __str__(self):
        return self.username

class CollectorProfile(models.Model):

    VISITA_CHOICES = (
        ('1','1'),('2','2'),('3+','3+'),('Nunca','NUNCA')
    )

    COMPRA_ARTE_CHOICES = (
        ('1+','Más de una vez al año'),('1-2','Cada 1 - 2 años'),('3-5','Cada 3 – 5 años'),('1era','Estoy buscando comprar mi primera obra')
    )

    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    location = models.CharField(max_length=64)
    company = models.CharField(max_length=64)
    visita = models.CharField(max_length = 20,choices = VISITA_CHOICES,default = 'Nunca') 
    compra_arte = models.CharField(max_length = 20,choices = COMPRA_ARTE_CHOICES,default = '1era')
    menciona_galerias = models.CharField(max_length=64)
    menciona_artistas = models.CharField(max_length=64)


class CuratorProfile(models.Model):

    VISITA_CHOICES = (
        ('1','NUNCA')
    )

    COMISARIO_CHOICES = (
        ('freelance','FREELANCE'),('otro','OTRO'),('no','NO SOY COMISARIO')
    )

    INSTITUCION_CHOICES = (
        ('muSEO','MUSEO'),('fundacion','FUNDACION'),('freelance','FREELANCE')
    )

    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    visita = models.CharField(max_length = 20,default = 'Nunca')
    comisario = models.CharField(max_length = 20,choices = COMISARIO_CHOICES,default = 'no')
    institucion = models.CharField(max_length = 20,choices = INSTITUCION_CHOICES,default = 'muSEO')
    menciona_exposiciones = models.CharField(max_length=64)

    def __str__(self):
        return self.user

class galeristProfile(models.Model):
    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    fundacion_galeria = models.CharField(max_length=64)
    menciona_exposiciones = models.CharField(max_length=64)
    menciona_artistas = models.CharField(max_length=64)

    def __str__(self):
        return self.user

class Pressprofile(models.Model):
    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    medio = models.CharField(max_length=64)

    def __str__(self):
        return self.user

class ArtistProfile(models.Model):
    user = models.OnetoOneField(User,on_delete=models.CASCADE)
    art = models.CharField(max_length=64)
    
    def __str__(self):
        return self.user

class GeneralProfile(models.Model):
    user = models.OnetoOneField(User,on_delete=models.CASCADE)

    def __str__(self):
        return self.user

forms.py

class RegistrationForm(UserCreationForm):

    class Meta(UserCreationForm):
        model = User
        labels = {
            "usertype": "Perfil"
        }
        fields = ('__all__')

class galeryForm(forms.Form):

    class Meta(UserCreationForm):
        model = galeristProfile
        fields = ('__all__')

class PressForm(forms.Form):

    class Meta:
        model = Pressprofile
        fields = ('__all__')


class ArtistForm(forms.Form):

    class Meta:
        model = ArtistProfile
        fields = ('__all__')

class CuratorForm(forms.Form):

    class Meta:
        model = CuratorProfile
        fields = ('__all__')


class CollectorForm(forms.Form):

    class Meta:
        model = CollectorProfile
        fields = ('__all__')

views.py

class UserRegisterView(CreateView):
    template_name = 'community/register.html'
    form_class = CustomUserCreationForm
    success_url = '/community/register/profile'


def ProfileRegisterView(request):
    current_user = request.user
    if request.method == 'POST':
        if form.is_valid():
            return HttpResponseRedirect('/')
    else:
        if current_user.usertype == 'galerist':
            form_class = galeryForm
        elif current_user.usertype == 'collector':
            form_class = CollectorForm
        elif current_user.usertype == 'artist':
            form_class = ArtistForm
        elif current_user.usertype == 'curator':
            form_class = CuratorForm
        elif current_user.usertype == 'press':
            form_class = PressForm
        elif current_user.usertype == 'general':
            return redirect('/community/home')
    return render(request,'community/register_profile',{'form': form_class})

urls.py

path('community/register/',views.UserRegisterView.as_view(),name='user_register'),path('community/register/profile',views.ProfileRegisterView,name='user_register_profile'),

一个寄存器部分工作正常,但是当我转到第二部分时,它变成了“分配前引用的局部变量‘form_class’”的错误。我已经搜索了很多关于如何创建类似的东西,但我没有找到任何解决方案。我想要做的是根据用户类型注册一个配置文件。一些帮助会很棒。

非常感谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)