Django - 如何运行连续的表格?

问题描述

我有一个用户注册表格,要求提供用户信息,同时也提出一个问题:“你是 PSMC 会员吗?”

选项是:

    rank = [
    ('Supporter','Supporter (non-member)'),('Anak','Anak'),('Uso','Uso'),('Chief','Chief'),]

如果选择了 Supporter,那么注册表会继续并保存用户信息等。这部分工作正常。但是,如果选择了 Anak,我希望它将用户带到另一个询问其他问题的表单。

在我的 forms.py 中,我有 RegisterForm 类,它是所有用户的主要注册表单。我还有 AnakRegisterForm 类,这是我希望它继续进行的。我根据我从他们的网站上读到的内容使用了 Django 的 AuthenticationForm (但我可能是错的)。我知道问题出在 views.py register 函数中。具体:

if rank == 'Anak':
   anak_register(response)

在我的调试会话期间,在将 response 移动到 anak_register 函数后,它获得了一堆乱码信息。我很迷茫,任何帮助将不胜感激。这是我的代码

forms.py

class RegisterForm(UserCreationForm):
    email = forms.EmailField(
        initial='',required=True,help_text='Please enter a valid email address'
    )

    rank = forms.ChoiceField(
        label='Are you a PSMC member?',choices=SavBlock.models.User.rank,initial=False,help_text='Member accounts will be validated with your HC.'
    )

    class Meta:
        model = User
        # username = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
        fields = ['username','first_name','last_name','email','rank','password1','password2']

    def save(self,commit=True):
        user = super(RegisterForm,self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.ranking = self.cleaned_data['rank']
        if commit:
            user.save()
        return user


class AnakRegisterForm(AuthenticationForm):
    tribe = forms.ChoiceField(
        label='What tribe are you from,Uce?',choices=SavBlock.models.Anak.tribe,help_text='Member accounts will be validated with your HC.'
    )

    class Meta:
        model = Anak
        fields = ['tribe']

    def save(self,commit=True):
        user = super(AnakRegisterForm,self).save(commit=False)
        user.tribe = self.cleaned_data['tribe']
        if commit:
            user.save()
        return user

class UsoRegisterForm(AuthenticationForm):
    pass


class ChiefRegisterForm(AuthenticationForm):
    pass

views.py

def register(response):
    context = {}
    if response.method == "POST":
        form = RegisterForm(response.POST)
        if form.is_valid():
            form.save()
            rank = form.cleaned_data.get('rank')
            if rank == 'Anak':
                anak_register(response)
            else:
                form.save()
            messages.success(response,'Registration successful. Please login.')
            return redirect('login')
        else:
            context['register'] = form
    else:
        form = RegisterForm()
        context['register'] = form

    return render(request=response,template_name='register/register.html',context={'form': form})


def anak_register(response):
    # context = {}
    if response.method == "POST":
        form = AnakRegisterForm(response.POST)
        if form.request.is_valid():
            form.save()
            messages.success(response,'Registration successful. Please login.')
            return redirect('login')
        else:
            '''
            context['register'] = form
            '''
    else:
        form = AnakRegisterForm()
        # context['register'] = form
        # messages.error(request,'Unsuccessful registration. Invalid information.')
    # form = RegisterForm

    return render(request=response,context={'form': form})

models.py

class User(AbstractBaseUser,PermissionsMixin):

    rank = [
        ('Supporter',]

    tribe = [
        ('NaKoaHema','Na Koa Hema'),('Alakai','Alaka\'i')
    ]

    username = models.CharField("user name",max_length=50,default='',unique=True)
    email = models.EmailField("email address",max_length=30,unique=True,blank=True)
    first_name = models.CharField("first name",max_length=50)
    last_name = models.CharField("last name",max_length=50)
    is_active = models.BooleanField('active',default=True)
    # password = models.CharField("password",max_length=32,default='')
    id = models.AutoField(primary_key=True)
    is_staff = models.BooleanField('staff status',default=False)
    date_joined = models.DateField('date_joined',default=timezone.Now)
    ranking = models.CharField(choices=rank,default="Supporter")

    objects = UserManager()

    USERNAME_FIELD = 'username'
    required_FIELDS = ['email','password','ranking']


    # Magic method returns string of self
    def __str__(self):
        return f"User {self.first_name} {self.last_name} rank {self.rank}".strip()

    @property
    def get_full_name(self):
        return f"{self.first_name} {self.last_name}".strip()


class Anak(User):
    def __init__(self,first_name,last_name,tribe):
        super().__init__(first_name,last_name)
        self.tribe = tribe.title()
        self.rank = User.rank[1]

编辑

我将 AuthenticationForm 更改为 UserCreationForm,现在它接受表单。但是,当我尝试运行它时,出现以下错误

TypeError at /register/
__init__() missing 1 required positional argument: 'tribe'

如果有人能指出我正确的方向,我将不胜感激!

解决方法

不知道我是怎么错过的,但我发现的最佳解决方案是实现 Django 表单向导。可在此处找到更多信息:

https://django-formtools.readthedocs.io/en/latest/wizard.html