manipulator.save(data)で保存するカスタムマニピュレータ?
面倒です。Modelに記述したものをもう一度記述し直す気にはなりません。
なので、動的に生成してみる。
#さきにバリデータを作成します。
#本来のバリデータは第一引数にselfがきますが・・
def is_valid_answer(data, form) :
#formには事前にvalid_answerを追加しておきます
if form.get('valid_answer').upper() != data.upper() :
raise validators.ValidationError, _('Your answer is not correct. Try it again!')
def add_comment(request, year, month, day, code) :
#通常通りAddManipulatorを生成します。
manipulator = Comment.AddManipulator()
entry = getEntry(year, month, day, code)
if request.method == 'POST' :
new_data = request.POST.copy()
#入力データに無理矢理データを追加します
new_data.update({'entry': entry.id, 'valid_answer': entry.answer})
#もし「質問」がエントリに設定されていたら・・・
if entry.riddle :
#manipulatorに無理矢理フィールドを追加します!
manipulator.fields += [forms.TextField(_('answer'), maxlength=50, is_required=True, validator_list=[is_valid_answer])]
#あとは通常通り
errors = manipulator.get_validation_errors(new_data)
if not errors :
manipulator.do_html2python(new_data)
manipulator.save(new_data)
entry.comment_count += 1
entry.save()
return HttpResponseRedirect('somewhere')
else :
errors = new_data = {}
#GETやバリデーションエラーがあった場合にはコメント入力画面に戻します
form = forms.FormWrapper(manipulator, new_data, errors)
return render_to_response('djablog/comment_form.html', {'form': form, 'object': entry})