houhou
houhou

Reputation: 177

add a validation error with form that contain html form and model form in Django

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

Answers (2)

Ade_1
Ade_1

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

Anthony
Anthony

Reputation: 959

If Appointment.objects.filter(patient=request.POST['patients']).exists():
   ...//create the appointment
else:
    raise ValidationError('Patient Does Not Exist')

Upvotes: 2

Related Questions