Any way to improve my fitness services app? [closed]
I'm still a somewhat beginner when it comes to coding (I have been slowly learning it in my own time and think I've gotten pretty good) but would greatly appreciate any feedback on my form functionality specifically, as that's what I have been trying to get down recently. I'd love to know if there is anything I can do to improve my code at all from optimisation to professionalism.
Thanks.
forms.py
class ConsultationForm(forms.ModelForm):
class Meta:
model = Consultation
fields = ['address_line_1', 'address_line_2', 'postcode', 'description', 'date']
widgets = {
'date': forms.DateInput(attrs={'type': 'date'}),
'description': forms.Textarea(attrs={'rows': 4})
}
class SessionForm(forms.ModelForm):
consultation = forms.ModelChoiceField(
queryset=Consultation.objects.all(),
empty_label="Select a consultation",
help_text="Please select a previous consultation",
required=True
)
class Meta:
model = Session
fields = ['consultation', 'workout', 'date']
widgets = {
'date': forms.DateInput(attrs={'type': 'date'}),
}
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
if user:
self.fields['consultation'].queryset = Consultation.objects.filter(user=user)
class CheckInForm(forms.ModelForm):
session = forms.ModelChoiceField(
queryset=Session.objects.all(),
empty_label="Select an session",
help_text="Please select a previous session",
required=True
)
class Meta:
model = CheckIn
fields = ['session', 'date']
widgets = {
'date': forms.DateInput(attrs={'type': 'date'}),
}
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
super().__init__(*args, **kwargs)
if user:
self.fields['session'].queryset = Session.objects.filter(user=user)
views.py
@login_required
def booking_form(request, service_type):
SERVICE_MAP = {
'consultation': {'form': ConsultationForm, 'model': Consultation},
'session': {'form': SessionForm, 'model': Session},
'checkin': {'form': CheckInForm, 'model': CheckIn}
}
if service_type not in SERVICE_MAP:
return redirect('services')
service_info = SERVICE_MAP[service_type]
FormClass = service_info['form']
ModelClass = service_info['model']
if request.method == 'POST':
if service_type in ['session', 'checkin']:
form = FormClass(request.POST, user=request.user)
else:
form = FormClass(request.POST)
if form.is_valid():
booking = form.save(commit=False)
booking.user = request.user
booking.save()
return redirect('profile')
else:
if service_type in ['session', 'checkin']:
form = FormClass(user=request.user)
else:
form = FormClass()
return render(request, 'booking_form.html', {
'form': form,
'service_type': service_type
})
def services(request):
return render(request, 'services.html')
booking_form.html
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h3 class="text-center">Book {{ service_type|title }} Service</h3>
</div>
<div class="card-body">
<form method="post" class="needs-validation" novalidate>
{% csrf_token %}
{% if service_type == 'session' %}
<div class="form-group row">
<label for="{{ form.consultation.id_for_label }}" class="col-sm-12">Previous Consultation</label>
<div class="col-sm-12">
{{ form.consultation }}
<small class="form-text text-muted">{{ form.consultation.help_text }}</small>
</div>
</div>
<div class="form-group row">
<label for="{{ form.workout.id_for_label }}" class="col-sm-12">workout Type</label>
<div class="col-sm-12">
{{ form.workout }}
</div>
</div>
{% endif %}
{% if service_type == 'checkin' %}
<div class="form-group row">
<label for="{{ form.session.id_for_label }}" class="col-sm-12">Previous session</label>
<div class="col-sm-12">
{{ form.session }}
<small class="form-text text-muted">{{ form.session.help_text }}</small>
</div>
</div>
{% endif %}
<div class="form-group row">
<label for="{{ form.date.id_for_label }}" class="col-sm-12">Preferred Date</label>
<div class="col-sm-12">
{{ form.date }}
</div>
</div>
{% if service_type == 'consultation' %}
<div class="form-group row">
<label for="{{ form.address_line_1.id_for_label }}" class="col-sm-12">Address Line 1</label>
<div class="col-sm-12">
{{ form.address_line_1 }}
</div>
</div>
<div class="form-group row">
<label for="{{ form.address_line_2.id_for_label }}" class="col-sm-12">Address Line 2 (Optional)</label>
<div class="col-sm-12">
{{ form.address_line_2 }}
</div>
</div>
<div class="form-group row">
<label for="{{ form.postcode.id_for_label }}" class="col-sm-12">Postcode</label>
<div class="col-sm-12">
{{ form.postcode }}
</div>
</div>
<div class="form-group row">
<label for="{{ form.description.id_for_label }}" class="col-sm-12">Description of Your Needs</label>
<div class="col-sm-12">
{{ form.description }}
</div>
</div>
{% endif %}
<div class="form-group row">
<div class="offset-sm-3 col-sm-9">
<button type="submit" class="btn btn-primary">Submit Booking</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
dashboard.html
<div class="dashboard">
<h2>Dashboard</h2>
<div class="card">
<h3>Upcoming Consultation</h3>
{% with consultation=user.consultation_set.all|dictsort:"date"|first %}
{% if consultation %}
<ul>
<li>On {{ consultation.date }} with {{ consultation.user.username }}</li>
<li>Address: {{ consultation.address_line_1 }} {{ consultation.address_line_2 }}</li>
<li>Postcode: {{ consultation.postcode }}</li>
<li>Description: {{ consultation.description }}</li>
</ul>
{% else %}
<p>You have no upcoming consultations</p>
{% endif %}
{% endwith %}
</div>
<div class="card">
<h3>Upcoming session</h3>
{% with session=user.session_set.all|dictsort:"date"|first %}
{% if session %}
<ul>
<li>{{ session.workout }} on {{ session.date }}</li>
</ul>
{% else %}
<p>You have no upcoming sessions</p>
{% endif %}
{% endwith %}
</div>
<div class="card">
<h3>Upcoming Check Ins</h3>
{% with checkin=user.checkin_set.all|dictsort:"date"|first %}
{% if checkin %}
<ul>
<li>{{ checkin.date }} for {{ checkin.workout }}</li>
</ul>
{% else %}
<p>You have no upcoming check ins</p>
{% endif %}
{% endwith %}
</div>
</div>