Django:我怎样才能在下拉列表中选择并重定向到另一个页面?

8ehkhllq  于 2023-01-06  发布在  Go
关注(0)|答案(1)|浏览(146)

我目前正在学习Django,我正在做电子成绩册。我已经尝试了所有的方法,阅读了所有的文档,但没有任何帮助。似乎我遗漏了一个简单的逻辑。我需要做两页:
第一个“教师界面”是一个简单的界面,教师只有一个下拉列表,教师选择必要的类(即1C,2B,4C)和按钮“学生”,这应该以某种方式从下拉列表输入所选的类,并重定向到第二页“类_学生”.
第二“班级_学生”类似于“教师_界面”,但是具有所选班级的学生表。
我在类Student和Class之间有一对多的关系:
首先,我尝试从“teacher_interface”重定向到“class_students”,在模板中使用:
第一个月
代码部分:1)models.py https://dpaste.org/eqxm 2)urls.py https://dpaste.org/eUEO 3)views.py https://dpaste.org/ap8D#L 4)模板教师_界面. html https://dpaste.org/v4m9 5)模板班级_学生. html https://dpaste.org/0gXK
但它告诉我:未找到不带参数的“class_students”的反向操作。尝试了1个模式:['学校/教师/(?P <class_id>[0-9]+)/班级/$']
我尝试了一切,但没有帮助,这和类似的:Django - getting Error "Reverse for 'detail' with no arguments not found. 1 pattern(s) tried:" when using {% url "music:fav" %}我明白也许这两个选项的重定向将不会在我的情况下工作:

{% url 'class_students' class.id %}

{% url 'class_students' class_id %}

我也不知道是否有可能在同一页上做。
所以我决定从django. shortcuts使用redirect进行重定向。我修改了我的teacher_interface视图,这样如果请求方法是POST,它就可以使用教师类选择的id进行重定向。我也在我的模板“teacher_interface. html”中做了这样的修改:

action="{% url 'class_students' %}"

action=""

更改视图:

def teacher_interface(request):
class_queryset = Class.objects.order_by("class_number", "group")
class_id = None
if request.method == "POST":
    class_id = Class.objects.get("id")
    return redirect("class_students", class_id)
context = {
    "class_queryset": class_queryset,
    "class_id": class_id,
}
return render(request, "teacher_interface.html", context)

但当我选择课程并点击“学生”按钮时,它显示给我:无法将关键字“i”解析到字段中。选项包括:class_number、课程、学科、组、id、学生、任务、type_of_class、type_of_class_id。id是一个关键字,但它试图只解析“i”。
我试过/读过这里的所有东西,但都不起作用。
我甚至这样写默认值:

class_id = Class.objects.get("id", "default")

我肯定我只是不明白如何正确地获得教师的选择,将其传递给另一个或相同的功能和重定向,保存此信息。我将非常感谢您的帮助,即使你只是建议我可以阅读弄清楚。

qcuzuvrc

qcuzuvrc1#

好吧,你漏掉了一些基本的概念。
在您的网站上views.py

def teacher_interface(request):
    class_queryset = Class.objects.order_by("class_number", "group")
    context = {
        "class_queryset": class_queryset,
    }
    return render(request, "teacher_interface.html", context)

这是正确的,您将把查询传递到模板
在您的模板上更改一些内容,如下所示:

<form method="POST" >{% csrf_token %}
<select name="input1">
    {% for class in class_queryset %}
    <option value="{{ class.id }}">{{ class }}</option>
    {% endfor %}
</select>
<input type="submit" value="Students"/>
</form>

那么你需要改变你的teacher_interface视图:您需要在www.example.com上导入重定向views.py

def teacher_interface(request):
    class_queryset = Class.objects.order_by("class_number", "group")
    context = {
        "class_queryset": class_queryset,
    }
    if request.method == 'POST':
        class_id = request.POST.get('input1') # I'm not sure if this will get the {{class.id}} value, if don't, print(request.POST.get) and check how to get the value
        return redirect('class_students', class_id=class_id) # will make a get request on the class_students view
    return render(request, "teacher_interface.html", context)

def class_students(request, class_id):
    # the parameter need to be 'class_id' because this is what you put on your urls '<int:class_id>', if possible, remove that /class.
    # ADD CLASS ID AS PARAMETER, THAT WILL ENABLE YOU TO ACESS AN SPECIFIC CLASS
    # Import get_object_or_404 (google it and you will find easily)
    class = get_object_or_404(Class, pk=class_id) # this avoid internal server error.
    # pass your class on the context
    return render(request, "class_students.html")

相关问题