在Django中添加包含html表单和模型表单的表单的验证错误



我在Django中使用了一个表单,其中包含一个部分html和第二个部分标签表单,比如这个html文件

<div class="container">
<form action="{% url 'create_appointement_register_patient' %}" method="POST">
<p>
<label for="patients">select a patient</label>
<select name="patients" id="patients">
<option value="">-- select a patient --</option>
{% for patient in patients %}
<option value="{{patient}}">{{patient}}</option>
{%empty%}
<option value="nothing">nothing</option>
{% endfor %}
</select>
</p> {{ form.media }} {{ form.as_p }} {% csrf_token %}
<button type="submit" value="create_appointement_register_patient">
ok
</button>
</form>
</div>

如何添加验证错误来验证患者是否在数据库中,如果患者的值不在数据库中则引发错误?

这是我的viwes.py

@login_required
def create_appointement_register_patient(request):
if request.user.is_doctor() or request.user.is_reception():
form_app = AppointmentForm_2(request.POST or None)
user2 = get_user_model()
patients = user2.objects.filter(type_of_user=TypeOfUser.PATIENT)
if request.method=='POST':
form_app = AppointmentForm_2(request.POST or None)
if form_app.is_valid():
form_apps = form_app.save(commit=False)
form_apps.user_ho_add = request.user
####################
form_apps.patient = request.POST['patients']

#####################
start_time = form_apps.start_time 
future_time = dt.datetime(1970, 1, 1, start_time.hour, start_time.minute, start_time.second, start_time.microsecond) + timedelta(minutes=30)
form_apps.end_time = dt.time(future_time.hour, future_time.minute, future_time.second, future_time.microsecond)
form_apps.save()
messages.success(request, 'appointment added')
else:
messages.error(request, 'Error')
return render(request,'appointement/add_appointement2.html',{'form':form_app, 'patients':patients}) 
else:
return render(request,'appointement/add_appointement2.html',{'form':form_app, 'patients':patients})
else:
return HttpResponseRedirect(reverse("create_appointement"))

这是我的表格.py

class AppointmentForm_2(forms.ModelForm):
doctor = forms.ModelChoiceField(queryset=User.objects.filter(type_of_user=TypeOfUser.DOCTOR))
date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}), input_formats=settings.DATE_INPUT_FORMATS)
start_time = forms.TimeField(widget=forms.DateInput(attrs={'type': 'time'}), input_formats=settings.TIME_INPUT_FORMATS)
class Meta:
model = Appointment
fields = ('doctor', 'date', 'start_time')

型号.py

class Appointment(models.Model):
user_ho_add = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='user_ho_add_appointment')
patient = models.CharField(null=True, blank=True,max_length = 200, default=defaultTitle)
doctor = models.ForeignKey(User, on_delete=models.CASCADE, related_name='doctor_app')
date = models.DateField(null=False, blank=False, default=timezone.now) 
start_time = models.TimeField(null=True, blank=True, default=timezone.now)
end_time = models.TimeField(null=True, blank=True, default=timezone.now)
If Appointment.objects.filter(patient=request.POST['patients']).exists():
...//create the appointment
else:
raise ValidationError('Patient Does Not Exist')

您可以在表单中创建验证。py

from django.core.exceptions import ValidationError
class AppointmentForm_2(forms.ModelForm):
doctor = forms.ModelChoiceField(queryset=User.objects.filter(type_of_user=TypeOfUser.DOCTOR))
date = forms.DateField(widget=forms.DateInput(attrs={'type': 'date'}), input_formats=settings.DATE_INPUT_FORMATS)
start_time = forms.TimeField(widget=forms.DateInput(attrs={'type': 'time'}), input_formats=settings.TIME_INPUT_FORMATS)
class Meta:
model = Appointment
fields = ('doctor', 'date', 'start_time')

def clean_patients(self):
patient_data= self.cleaned_data['patient']

#  do your check here and if it fails the test raise an exception
raise ValidationError ('patient does not exist')
return patient_data    # <-----ensure you return this

最新更新