这与此非常相关: How to access data when form.is_valid() is false
在我的情况下,如果表单验证失败,我想让用户查看带有错误消息的同一页面并让它显示一个新的和修改过的clean_data注释。现在,如果表单验证失败,它将显示包含旧用户提交的评论的页面。我想要显示修改后的注释的原因是因为我希望新数据与错误消息匹配。例如,如果用户提交了
' hey bye '
为了达到20个字符的最小限制,我的清洁功能将剥离空白区域并将其修剪为
'hey bye'
然后验证失败。错误消息将显示“注释长度至少需要20个字符”。使用旧数据,用户会感到困惑,因为他实际上输入了超过20个字符,旧数据将显示它。我希望他们看到剥离的评论,所以他们会知道为什么我失败了。
这是我的代码......
views.py
def question(request, qid):
quest = shortcuts.get_object_or_404(askbox.models.Question, pk=qid)
log.info("Question #{0}: {1}".format(qid, quest))
user = SessionManager.getLoggedInUser(request)
answerForm = AnswerForm()
if request.method == "POST":
if user == None:
return HttpResponseRedirect(reverse('login.views.login'))
answerForm = AnswerForm(request.POST)
if answerForm.is_valid():
# user posted an answer
answerForm.question = quest
answerForm.user = user
answerForm.save()
return HttpResponseRedirect(reverse('question.views.question', args=(quest.id,)))
else:
#answerForm.text = answerForm.saved_data['text'] #doesn't work too
answerForm.text = "foo" # doesn't work...
else: # GET request
# landing page
# probably do nothing
pass
print "AnswerForm: {0}".format(answerForm)
mediaList = askbox.models.Media.objects.filter(question=qid)
return shortcuts.render_to_response('question/question.html', {
'title': 'Groupthink | {0}'.format(quest.question),
'css_list': css_list,
'js_list': js_list,
'question': quest,
'mediaList': mediaList,
'user': user,
'answerForm': answerForm,
}, context_instance=RequestContext(request))
forms.py
# fake abstract class...
class AbstractCommentForm(forms.ModelForm):
text = forms.CharField(min_length=MIN_ANSWER_LEN, max_length=MAX_ANSWER_LEN, widget=forms.Textarea) # the comment text
def clean_text(self):
# we want to avoid user cheating the system. We'll trim extra spaces between characters and then strip spaces at both ends of the string
field = 'text'
self.cleaned_data[field] = (re.sub(r' +', ' ', self.cleaned_data[field])).strip()
self.text = self.cleaned_data[field] # doesn't work
text_len = len(self.cleaned_data[field])
self.saved_data = self.cleaned_data # doesn't work
if text_len < MIN_ANSWER_LEN:
raise forms.ValidationError("The comment length needs to be at least {0} characters long".format(MIN_ANSWER_LEN))
if text_len > MAX_ANSWER_LEN:
raise forms.ValidationError("The comment length exceeds the maximum {0} characters".format(MAX_ANSWER_LEN))
return self.cleaned_data[field]
class CommentForm(AbstractCommentForm):
class Meta:
model = Comment
class AnswerForm(AbstractCommentForm):
class Meta:
model = Answer