Перенос пользовательского ввода с одной страницы на другую

Я делаю сайт, который позволяет студентам находить предстоящие учебные занятия по своим предметам. Я делаю это на 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 отношения.

Вернуться на верх