我在视图和窗体之间传递对象并返回时遇到问题。
在第一个表单中,我用电子邮件检查令牌(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