Inserisci qui la tua pubblicità

Modulo di prenotazione con Django e Javascript

Api, React.js o Next.js

Creare un modulo per la prenotazione degli esami in Django, con un frontend interattivo (JavaScript, React o Next.js), richiede la definizione di modelli, logica backend e frontend dinamico. Ecco una guida passo-passo:


1. Backend con Django

1.1 Modelli

Defini i modelli per gestire i master, le materie, e le prenotazioni.


 

 

from django.db import models
from django.core.exceptions import ValidationError
from datetime import date, timedelta

class Master(models.Model):
    name = models.CharField(max_length=100)
    cost = models.DecimalField(max_digits=10, decimal_places=2)

    def __str__(self):
        return self.name

class Subject(models.Model):
    master = models.ForeignKey(Master, related_name='subjects', on_delete=models.CASCADE)
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Booking(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)
    email = models.EmailField()
    master = models.ForeignKey(Master, on_delete=models.CASCADE)
    subjects = models.ManyToManyField(Subject, blank=True)
    final_exam = models.BooleanField(default=False)
    enrollment_date = models.DateField(null=True, blank=True)

    def clean(self):
        if self.final_exam and self.enrollment_date:
            six_months_ago = date.today() - timedelta(days=180)
            if self.enrollment_date > six_months_ago:
                raise ValidationError("Devi essere iscritto al master da almeno 6 mesi per sostenere l'esame finale.")

    def __str__(self):
        return f"{self.first_name} {self.last_name} - {self.master.name}"

1.2 Form

Crea un modulo personalizzato per gestire la logica dei campi condizionali.


 
from django import forms
from .models import Booking

class BookingForm(forms.ModelForm):
    class Meta:
        model = Booking
        fields = ['first_name', 'last_name', 'email', 'master', 'subjects', 'final_exam', 'enrollment_date']
        widgets = {
            'subjects': forms.CheckboxSelectMultiple(),
            'enrollment_date': forms.DateInput(attrs={'type': 'date'}),
        }
    
    def clean(self):
        cleaned_data = super().clean()
        final_exam = cleaned_data.get('final_exam')
        enrollment_date = cleaned_data.get('enrollment_date')
        
        if final_exam and not enrollment_date:
            raise forms.ValidationError("Seleziona la data di iscrizione al master.")

1.3 Views

Crea una vista per gestire la creazione di una prenotazione.


 

 

from django.shortcuts import render, redirect
from .forms import BookingForm

def book_exam(request):
    if request.method == 'POST':
        form = BookingForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('success')  # Puoi definire una pagina di successo
    else:
        form = BookingForm()
    return render(request, 'book_exam.html', {'form': form})

1.4 Template

Crea un template con campi condizionali per il frontend.


 
<!DOCTYPE html>
<html>
<head>
    <title>Prenotazione Esame</title>
</head>
<body>
    <h1>Prenotazione Esame</h1>
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
        <div id="final_exam_section" style="display: none;">
            <label for="id_enrollment_date">Data di iscrizione al master:</label>
            {{ form.enrollment_date }}
        </div>
        <button type="submit">Prenota</button>
    </form>

    <script>
        const finalExamCheckbox = document.getElementById('id_final_exam');
        const enrollmentDateSection = document.getElementById('final_exam_section');

        finalExamCheckbox.addEventListener('change', function() {
            if (this.checked) {
                enrollmentDateSection.style.display = 'block';
            } else {
                enrollmentDateSection.style.display = 'none';
            }
        });
    </script>
</body>
</html>

2. Frontend con React o Next.js

Se preferisci un frontend dinamico, React o Next.js può essere integrato tramite una REST API o Django REST Framework (DRF).

2.1 API Django

Installa DRF e crea un'API per gestire le prenotazioni.


 
pip install djangorestframework

Aggiungi rest_framework in INSTALLED_APPS.

Crea una viewset per gestire le prenotazioni:


 
from rest_framework import viewsets
from .models import Booking, Master, Subject
from .serializers import BookingSerializer

class BookingViewSet(viewsets.ModelViewSet):
    queryset = Booking.objects.all()
    serializer_class = BookingSerializer

Crea il serializer:


 
from rest_framework import serializers
from .models import Booking

class BookingSerializer(serializers.ModelSerializer):
    class Meta:
        model = Booking
        fields = '__all__'

2.2 Frontend React/Next.js

Crea un modulo interattivo usando React/Next.js. Usa una libreria come Axios per inviare i dati all'API Django.

Esempio con Next.js:


 
import { useState } from 'react';
import axios from 'axios';

export default function BookingForm() {
    const [formData, setFormData] = useState({
        first_name: '',
        last_name: '',
        email: '',
        master: '',
        subjects: [],
        final_exam: false,
        enrollment_date: '',
    });

    const handleChange = (e) => {
        const { name, value, type, checked } = e.target;
        setFormData({
            ...formData,
            [name]: type === 'checkbox' ? checked : value,
        });
    };

    const handleSubmit = async (e) => {
        e.preventDefault();
        try {
            await axios.post('/api/bookings/', formData);
            alert('Prenotazione completata!');
        } catch (error) {
            console.error(error);
            alert('Errore durante la prenotazione.');
        }
    };

    return (
        <form onSubmit={handleSubmit}>
            <input type="text" name="first_name" placeholder="Nome" onChange={handleChange} />
            <input type="text" name="last_name" placeholder="Cognome" onChange={handleChange} />
            <input type="email" name="email" placeholder="Email" onChange={handleChange} />
            <select name="master" onChange={handleChange}>
                <option value="">Seleziona un Master</option>
                <option value="1">Master 1</option>
                <option value="2">Master 2</option>
            </select>
            <label>
                <input type="checkbox" name="final_exam" onChange={handleChange} />
                Sostieni esame finale
            </label>
            {formData.final_exam && (
                <input type="date" name="enrollment_date" onChange={handleChange} />
            )}
            <button type="submit">Prenota</button>
        </form>
    );
}

Con queste indicazioni puoi scegliere se utilizzare un approccio basato solo su Django o combinare Django e React/Next.js. Fammi sapere se hai domande o se ti servono dettagli specifici! 😊

 

 

 

4o

barone.anto1@gmail.com

Iscriviti alla nostra newsletter

Iscriviti alla nostra newsletter per non perderti nessuna novità!

Il tuo indirizzo email