Как создать зависимую выпадающую форму в Django
Я долго и безуспешно искал ответ на этот вопрос. Я хотел бы создать простую зависимую выпадающую форму в Django. Первое поле должно быть "отработкой", которую нужно выбрать, а второе поле должно быть models.PositiveIntergerField()
с некоторыми валидаторами в нем, приходящими из модуля django.core.validators
. Я бы хотел, чтобы это целое число зависело от количества "упражнений" в выбранной "тренировке" (упражнение имеет внешний ключ к тренировке). Когда пользователь выберет тренировку, количество упражнений будет зависеть от того, сколько упражнений на самом деле в этой тренировке. Пока что мне удалось получить первое поле, но не целочисленное поле. Ниже приведены forms.py, views.py, model.py и routine.html моего приложения.
forms.py - настройте его так, чтобы пользователь мог видеть только созданные им тренировки и упражнения
from django import forms
from .models import Workout, Exercise, Routine
class RoutineForm(forms.ModelForm):
"""creates a form for a routine"""
def __init__(self, *args, user=None, **kwargs):
super().__init__(*args, **kwargs)
self.fields['workout'].queryset = Workout.objects.filter(owner=user)
class Meta:
model = Routine
fields = ['workout']
labels = {'workout': '',}
views.py
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from .models import Workout, Exercise
from .forms import RoutineForm
@login_required
def routine(request):
"""display a dropdown of all workouts for a user"""
if request.method != 'POST':
form = RoutineForm(user=request.user) #creating a form here with user id in mind
#the request has a user attribute because we know who is requesting this information
else:
form = RoutineForm(data=request.POST, user=request.user) #loading data from form with user id in mind
if form.is_valid():
form.instance.owner = request.user
new_routine = form.save()
return redirect('index')
context = {'form':form}
return render(request, 'routine_workouts_app/routine.html', context)
models.py
from django.db import models
from django.contrib.auth.models import User
from django.core.validators import MaxValueValidator, MinValueValidator
class Routine(models.Model):
"""Shows a routine"""
workout = models.ForeignKey(Workout, on_delete=models.CASCADE) #does not have and id attribute bc it is a key not an object
owner = models.ForeignKey(User, on_delete=models.CASCADE)
#num_of_exercises = models.PositiveIntegerField(default=0, validators=[MaxValueValidator(#integer I need based off of workout), MinValueValidator(0)])
def __str__(self):
return 'this is a routine'
routine.html
{% extends 'routine_workouts_app/base.html' %}
{% block content %}
<p>this is the home page for creating routines</p>
<form action="{% url 'routine_workouts_app:routine' %}" method="POST">
{% csrf_token %}
{{ form.as_p }}
<button name='submit'>create routine</button>
</form>
{% endblock content %}
Этот код работает, но не в той степени, в которой я хочу. Я читал на многих сайтах о jQuery, Ajax, django-2select и других вещах, но у меня были проблемы с их реализацией и я застрял где-то на полпути. Есть предложения, как реализовать зависимую выпадающую форму? Есть ли какие-нибудь учебники по этой теме? Сайты с подробным объяснением? Я прилагаю фотографию того, как выглядит мое приложение с предоставленным кодом.