首页 > 解决方案 > 在表单和视图之间传递对象

问题描述

我在视图和表单之间传递对象并返回时遇到问题。

在第一种形式中,我使用电子邮件检查令牌(GET) - 如果没问题 - 你可以走得更远。如果没有 - 走开:D

视图.py:

def login(request):
    try:
        token = request.GET['token']
    except:
        return render(request,'error.html')

    if request.method == 'POST':
        form = LoginForm(request.POST)

        if form.is_valid():
            return HttpResponseRedirect('/vote/')
    else:
       form = LoginForm(initial={'token': request.GET['token']})

    return render(request,'login.html', context = {'form':form})

表格.py:

class LoginForm(forms.Form):
    email = forms.EmailField(label='Email', max_length=254,widget=forms.TextInput(attrs={'class':'required'}))
    token = forms.CharField(widget=forms.HiddenInput())

    def clean(self):
        cleaned_data = super().clean()
        try:
            voter = Person.objects.get(email__iexact=cleaned_data['email'],token__exact=cleaned_data['token'])
            
        except Person.DoesNotExist:
            raise ValidationError('Invalid email')

有用。

但现在我试着去投票表格。我想使用 voter 对象(在 LoginForm 中设置)。当然这是不同的形式,所以我必须通过它。我考虑过 session,但没有 request.session 形式。这是在视图中,但没有选民......或者是吗?

标签: django-viewsdjango-forms

解决方案


和往常一样,当我被困了很多分钟时,我写了这个问题,几分钟后我得到了很好的解决方案,所以我想与你分享:

我将检查移入视图并使用 form.add_error。而且我不再需要令牌隐藏字段:

表格.py:

class LoginForm(forms.Form):
    email = forms.EmailField(label='Email', max_length=254,widget=forms.TextInput(attrs={'class':'required'}))

视图.py:

def login(request):
    try:
      token = request.GET['token']
    except:
        return render(request,'error.html')

    if request.method == 'POST':
        form = LoginForm(request.POST)

        if form.is_valid():
            try:
                voter = Person.objects.get(email__iexact=form.cleaned_data['email'],token__exact=token)
                return HttpResponseRedirect('/vote/')
            except Person.DoesNotExist:
                form.add_error('email','Invalid email')
    else:
        form = LoginForm()

    return render(request,'login.html', context = {'form':form})

现在我可以使用请求、会话等将选民传递到下一个表单:D


推荐阅读