次のようなフォームを取得しました。
class CourseAddForm(forms.ModelForm):
"""Add a new course"""
name = forms.CharField(label=_("Course Name"), max_length=100)
description = forms.Textarea()
course_no = forms.CharField(label=_("course Number"), max_length=15)
#Attach a form helper to this class
helper = FormHelper()
helper.form_id = "addcourse"
helper.form_class = "course"
#Add in a submit and reset button
submit = Submit("Add", "Add New Record")
helper.add_input(submit)
reset = Reset("Reset", "Reset")
helper.add_input(reset)
def clean(self):
"""
Override the default clean method to check whether this course has been already inputted.
"""
cleaned_data = self.cleaned_data
name = cleaned_data.get('name')
hic = cleaned_data.get('course_no')
try:
course=Course.objects.get(name=name)
except Course.DoesNotExist:
course=None
if course:
msg = u"Course name: %s has already exist." % name
self._errors['name'] = self.error_class([msg])
del cleaned_data['name']
return cleaned_data
else:
return self.cleaned_data
class Meta:
model = Course
ご覧のとおり、ユーザーがコースを追加しようとしたときに、このコースがデータベースに既に存在するかどうかを確認する clean メソッドを上書きしました。これは私にとってはうまくいきます。
しかし、編集用のフォームに同じチェックを追加したい場合、問題が発生しました。編集中のため、同じコース名のレコードが既にDBに存在しています。したがって、同じチェックを行うと、コース名が既に存在するというエラーがスローされます。ただし、ユーザーがコース名を別の既存のコース名に更新しないようにするために、重複を確認する必要があります。
コース名の値が変わっていないか調べてみようと思っています。変更されている場合は、上記と同じチェックを行うことができます。変更されていない場合は、チェックを行う必要はありません。しかし、編集用の元データを取得する方法がわかりません。
Djangoでこれを行う方法を知っている人はいますか?
私の見解は次のようになります。
@login_required
@csrf_protect
@never_cache
@custom_permission_required('records.change_course', 'course')
def edit_course(request,course_id):
# See if the family exists:
try:
course = Course.objects.get(id=course_id)
except Course.DoesNotExist:
course = None
if course:
if request.method == 'GET':
form = CourseEditForm(instance=course)
return render_to_response('records/add.html',
{'form': form},
context_instance=RequestContext(request)
)
elif request.method == 'POST':
form = CourseEditForm(request.POST, instance=course)
if form.is_valid():
form.save()
return HttpResponseRedirect('/records/')
# form is not valid:
else:
error_message = "Please correct all values marked in red."
return render_to_response('records/edit.html',
{'form': form, 'error_message': error_message},
context_instance=RequestContext(request)
)
else:
error = "Course %s does not exist. Press the 'BACK' button on your browser." % (course)
return HttpResponseRedirect(reverse('DigitalRecords.views.error', args=(error,)))
ありがとうございました。