Reputation: 177
I am using a form in Django that contain a part html and the 2nd part tag form like this html file
<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>
How can I add a validation error that verifies if the patient is in the database or its not, if the value of patient is not in the database than raise an error?
this is my 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"))
and this is my forms.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')
models.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)
Upvotes: 1
Views: 118
Reputation: 1486
You can create the validation in your forms.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
Upvotes: 1
Reputation: 959
If Appointment.objects.filter(patient=request.POST['patients']).exists():
...//create the appointment
else:
raise ValidationError('Patient Does Not Exist')
Upvotes: 2