Перенос пользовательского ввода с одной страницы на другую
Я делаю сайт, который позволяет студентам находить предстоящие учебные занятия по своим предметам. Я делаю это на Django и HTML. Студент загружает свои курсы на сайт, и они отображаются на странице курсов в виде кнопок (например, CS 101 - Intro to CS). Когда студент нажимает на один из своих курсов (кнопку), он должен попасть на страницу, где показаны доступные учебные занятия по этому курсу. Я застрял, потому что не знаю, как правильно отфильтровать доступные учебные занятия на следующей странице в зависимости от того, какой курс был выбран. Есть ли способ сохранить информацию о курсе как переменную, чтобы при нажатии кнопки я мог использовать эту переменную для фильтрации результатов?
Вот страница, которая показывает курсы пользователя
<div class="container h-100" style="top:50%; bottom:50%; width:100%;">
<div class="row">
{% if courses_list %}
{% for course in courses_list %}
<a type="button" class="btn btn-outline-secondary" href="{% url 'study:course-session'%}" >{{ course.subject }} {{ course.number}}-{{course.name}} </a>
<br><br><br>
{% endfor %}
{% else %}
<p class="text-center">You have not added any courses yet!</p>
{% endif %}
</div>
</div>
А вот страница, на которой я пытаюсь отфильтровать список учебных занятий (которые имеют поле course, которое является ForeignKey к модели Courses):
<div class="row">
{% if sessions_list %}
{% for session in sessions_list %}
<button type="button" class="btn btn-outline-secondary" > {{ session.date }} - {{ session.location }} </button>
<br><br><br>
{% endfor %}
{% else %}
<p class="text-center">There are no upcoming study sessions at this time for the requested course.</p>
{% endif %}
</div>
Это будет очень общий ответ, поскольку вы не предоставили свои модели или взгляды, но я думаю, что идея будет следующей.
Во-первых, в вашем шаблоне вы можете передать параметр для номера курса в url:
ваш_шаблон.html
<a type="button" class="btn btn-outline-secondary"
href="{% url 'study:course-session' course.pk %}">
{{ course.subject }} {{ course.number}}-{{course.name}}
</a>
Затем в своем представлении вы можете получить доступ к этому значению и из него получить курс:
views.py
def the_view_name(request, course_pk):
# Here you now have access to the course's primary key, pk, so you can get the
# course and filter the study sessions by that course, etc...
Вам нужно будет изменить urls.py, чтобы представление могло принимать этот новый параметр:
urls.py
path('the_view_name/<int:course_pk>', views.the_view_name, name='the_view_name'),
Note:Имя представления, основанного на функции, не обязательно должно быть вPascalCase, как в вашем случае, оно должно быть вsnake_case.
Страница, которая показывает курсы пользователя, там нужно pk курсов:
<div class="container h-100" style="top:50%; bottom:50%; width:100%;">
<div class="row">
{% if courses_list %}
{% for course in courses_list %}
<a type="button" class="btn btn-outline-secondary" href="{% url 'study:course-session' course.pk %}" >{{ course.subject }} {{ course.number}}-{{course.name}} </a>
<br><br><br>
{% endfor %}
{% else %}
<p class="text-center">You have not added any courses yet!</p>
{% endif %}
</div>
</div>
Ваш вид для шаблона, я определяю его в snake_case, так как это рекомендуемый способ.
def course_session(request, course_pk):
course_wanted = Course.objects.get(id=course_pk)
study_courses=''
try:
study_courses= Study.objects.filter(course=course_wanted)
except:
messages.error(request, 'There are no upcoming study sessions at this time for the requested course.')
else:
return render(request,'anyfolder/anyfile.html',{'study_courses':study_courses})
return render(request,'anyfolder/anyfile.html') #then it will show only your error message.
Затем в любом файле template вы можете обратиться к нему и выполнить цикл:
{% for study in study_courses %}
{{study.organizer}},{{study.date}}
{% endfor %}
Тогда вы сможете получить доступ ко всем его свойствам и воспользоваться преимуществами ManyToOne отношения.