Как использовать получение данных из базы данных с помощью Django GET Form?
У меня небольшие проблемы с пониманием того, как работают формы в Django. Я хочу получить информацию из моей базы данных и отобразить ее в выпадающем меню. Когда пользователь выбирает один из пунктов и отправляет свой выбор, следующая страница должна отображать содержимое этого пункта. В моем примере есть "Тренировки", которые содержат "Упражнения". После выбора тренировки должны отображаться упражнения этой тренировки. Я получаю следующую ошибку:
NoReverseMatch at /routines/
Повтор для 'routine' с аргументами '('',)' не найден. Проверен 1 шаблон(ы): ['routines/(?P<workout_id>[0-9]+)/$']
Вот где, на мой взгляд, кроется проблема:
routines.html
<form action="{% url 'routine_workouts_app:routine' workout.id %}" method="get">
{% csrf_token %}
{{ form.as_p }}
<button name="submit">Make Workout</button>
</form>
У меня проблема с действием формы. Ошибка говорит, что не удается найти шаблон routine.html (который я дважды проверил, и он написан правильно и существует). Я думаю, это происходит потому, что все, что я делаю с 'workout.id', неправильно, но я не знаю почему.
Ниже я покажу соответствующий url и вид. Если потребуется дополнительная информация, например, файл form.py, я предоставлю ее.
views.py
def routines(request): #as it is, there can only be one argument
"""This view will provide a dropdown list of all of the workouts of a specific user.
Once one is selected, the user will hit a submit button.
After submitted, a new page will show all the exercises for that workout"""
if request.method == "GET":
#if we have a GET response, provide a form with filled data
form = RoutineForm(request.GET, user=request.user)
data = 0 #this isnt working but I may be on the right path
if form.is_valid():
#I need to get the id from the selected workout
data = form.cleaned_data.get("workout.id") #is id a form field? maybe function doesnt know what workout is right now
#if the selected item is proper...
form.instance.owner = request.user #make sure we have the right user
form.save()
return HttpResponseRedirect('routine_workouts_app:routines')
context = {'form':form, 'data':data}
return render(request, 'routine_workouts_app/routines.html', context)
def routine(request, workout_id):
"""I think this is the view that will display the information of a workout as of now.
Should be similar to the workout view."""
a_workout = Workout.objects.get(id=workout_id)
#Make sure the topic belongs to the current user
if a_workout.owner != request.user:
raise Http404
exercises = a_workout.exercise_set.order_by('exercise_name')
context = {'a_workout': a_workout, 'exercises':exercises}
return render(request, 'routine_workouts_app/routine.html', context)
А вот ссылки на игру:
path('routines/', views.routines, name='routines'), #this one deals with selecting a workout and submitting a form
#via routine/ shows the specific workout. just like workouts/int
path('routines/<int:workout_id>/', views.routine, name='routine'), #this one displays the information based on the form
Любая помощь будет принята с благодарностью. Правильно ли я делаю, что использую метод GET в своей форме или мне следует использовать POST? Является ли действие моей формы неправильным? Я смог направить форму после отправки на существующую страницу (опустив аргумент workout.id) просто отлично, но когда я пытаюсь направить ее на рутину с аргументом, я получаю ошибку, указанную выше.
Заранее благодарю за помощь