将用户输入从一个页面传输到另一个页面



我正在制作一个网站,让学生可以找到即将到来的课程学习课程。我在Django和HTML中做这件事。学生将他们的课程上传到网站,并在课程页面上显示为按钮(例如CS 101-CS简介(。当学生点击他们的一门课程(按钮(时,它应该会将他们带到一个页面,显示该课程的可用学习课程。我被卡住了,因为我不知道如何根据点击的课程正确过滤下一页上的可用学习课程。有没有办法将课程信息存储为变量,这样当点击按钮时,我就可以使用该变量来过滤结果EDIT:我已经做了这些更改,现在我得到一个ValueError,值太多,无法解压缩预期的2。我几乎可以肯定,在我看来,这种情况正在发生

这是显示用户课程的页面:

<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>

这是我试图过滤学习课程列表的页面(其中有一个领域课程,是课程模型的ForeignKey(:

<h1><center>Upcoming Study Sessions</center></h1>
<div>
<a class="btn btn-success" style="position:absolute; margin-right:2px; top:15%; right:0;" href="{% url 'study:courses' %}" role="button" >Back to My Courses</a>


</div>
<br><br>
<div class="container h-100" style="top:50%; bottom:50%; width:100%;">
<div class="row">
<button type="button" class="btn btn-outline-secondary" >Date/Time: {{ session.date }} <br> Location: {{ session.location }} </button>
<br><br><br>

</div>
</div>

模板视图:

def CourseSessionView(request, course_pk):
course_wanted = Course.objects.get(id=course_pk)
try:
return Study.objects.filter(course=course_wanted)
except:
return messages.error(request, 'There are no upcoming study sessions at this time for the requested course.')

课程和会话模型:

class Course(models.Model):
SUBJECT_CHOICES = [
('AAS', 'AAS')
]
subject = models.CharField(
max_length=4, choices=SUBJECT_CHOICES, default='')
number = models.PositiveSmallIntegerField(
validators=[MaxValueValidator(9999)], default=0)
name = models.CharField(max_length=100, default='')
roster = models.ManyToManyField(
Student, blank=True, related_name="courses")
# Use [Student object].courses.all() to see all of a student's courses
def __str__(self):
return f"{self.subject} {self.number} - {self.name}"

class Study(models.Model):
organizer = models.ForeignKey(Student, on_delete=models.CASCADE)
date = models.DateTimeField()
# Use [Student object].studies.all() to see all of a student's study sessions
attendees = models.ManyToManyField(Student, related_name="studies")
location = models.CharField(max_length=30)
course = models.ForeignKey(Course, on_delete=models.CASCADE)
def __str__(self):
return f"{self.date} - {self.location}"

Url:

path('<int:course_pk>/sessions/',
views.CourseSessionView, name='course-session')

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.

urls.py中的url类似于:

path('any_route_name/<int:course_pk>/', views.course_session, name='course_session')

Note:永远不要忘记在urlroute_name结束时传递/

然后,在任何template文件中,您都可以访问它并运行循环:

{% for study in study_courses %}
{{study.organizer}},{{study.date}}
{% endfor %}

然后,您可以访问它的所有属性,并利用ManyToOne关系。

这将是一个非常通用的答案类型,因为您没有提供您的模型或视图,但我认为想法如下。

首先,在你的模板中,你可以在url中为课程编号传递一个参数:

your_template.html

<a class="btn btn-outline-secondary" 
href="{% url 'study:course-session' course.pk %}">
{{ course.subject }} {{ course.number}}-{{course.name}}
</a>

然后在你看来,你可以访问这个值,并从中获得课程:

视图.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'),

编辑
进行以下更改:
首先访问您的视图.py:

def CourseSessionView(request, course_pk):
try:
course_wanted = Course.objects.get(id=course_pk)
except:
return messages.error(request, 'course not found')
study_sessions = Study.objects.filter(course=course_wanted)
if study_sessions.count() < 1:
return messages.error(request, 'There are no upcoming study sessions at this time for the requested course')
context = {
'study_sessions': study_sessions,
}
return render(request, 'study/your_template_file.html', context)

然后在你的html 中

<h1><center>Upcoming Study Sessions</center></h1>
<div>
<a class="btn btn-success" style="position:absolute; margin-right:2px; top:15%; right:0;" href="{% url 'study:courses' %}" role="button" >Back to My Courses</a>
</div>
<br><br>
<div class="container h-100" style="top:50%; bottom:50%; width:100%;">
{% for session in study_sessions %}
<div class="row">
<button type="button" class="btn btn-outline-secondary" >Date/Time: {{ session.date }} <br> Location: {{ session.location }} </button>
<br><br><br>
</div>
{% endfor %}

</div>

最新更新