在窗体和视图之间传递对象



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

在第一个表单中,我用电子邮件检查令牌(GET(——如果可以的话——你可以更进一步。如果没有-离开:D

views.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})

forms.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')

它有效。

但现在我试着去投票表。我想使用投票者对象(在LoginForm中设置(。当然,这是不同的形式,所以我必须通过它。我想过会议,但没有请求。会议形式。这是可以看到的,但没有选民。。。还是这样?

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

我将签入视图并使用form.add_error。我不再需要令牌隐藏字段:

forms.py:

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

views.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

最新更新