You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何从HTML模板表单获取科目ID以实现选课跳转

解决方案

一、原生HTML表单获取科目ID的方法

你的HTML表单缺少两个关键部分:<select>标签的name属性(用于标识提交的字段)和Django要求的CSRF令牌。修改后即可正常获取选中的科目ID:

修改HTML模板

<form method="POST">
    {% csrf_token %} <!-- Django POST表单必须添加,防止跨站请求伪造 -->
    <select name="subject_id"> <!-- 给select添加name属性,作为字段标识 -->
        {% for subject in subjects %}
        <option value="{{subject.id}}">{{subject.name}}</option>
        {% endfor %}
    </select>
    <button type="submit">确认选课</button> <!-- 添加提交按钮触发POST请求 -->
</form>

修改视图函数

在POST请求中,通过request.POST.get('subject_id')获取选中的科目ID,同时做基础校验:

def enroll(request, id_user):
    subjects = Subjects.objects.all()
    if request.method == "GET":
        return render(request, 'enrollSubject.html', {'subjects': subjects})
    if request.method == "POST":
        # 获取提交的科目ID,转成整数类型
        id_subject = request.POST.get('subject_id')
        if id_subject:
            id_subject = int(id_subject)
            return redirect(f'../enroll/add/{id_user}/{id_subject}')
        # 未选中科目时,返回表单并提示错误
        return render(request, 'enrollSubject.html', {
            'subjects': subjects,
            'error': '请选择一个科目'
        })

二、使用Django Form类实现的方法

用Django内置的Form类可以更规范地处理表单验证、字段渲染,代码可维护性更强:

1. 创建Form类(forms.py)

from django import forms
from .models import Subjects

class EnrollSubjectForm(forms.Form):
    # 自动生成科目选择下拉框,关联Subjects模型
    subject = forms.ModelChoiceField(
        queryset=Subjects.objects.all(),
        label='选择科目',
        to_field_name='id',  # 提交时传递科目ID
        widget=forms.Select()  # 可自定义HTML属性,比如添加样式类
    )

2. 修改视图函数

from .forms import EnrollSubjectForm

def enroll(request, id_user):
    if request.method == "GET":
        # 初始化空表单
        form = EnrollSubjectForm()
        return render(request, 'enrollSubject.html', {'form': form})
    if request.method == "POST":
        # 用POST数据初始化表单并验证
        form = EnrollSubjectForm(request.POST)
        if form.is_valid():
            # 从验证后的清洁数据中获取科目对象,再提取ID
            subject = form.cleaned_data['subject']
            id_subject = subject.id
            return redirect(f'../enroll/add/{id_user}/{id_subject}')
        # 验证失败时,返回带错误信息的表单
        return render(request, 'enrollSubject.html', {'form': form})

3. 简化HTML模板

直接渲染Form类生成的字段,无需手动循环科目:

<form method="POST">
    {% csrf_token %}
    {{ form.as_p }} <!-- 自动渲染表单为段落格式,也可自定义渲染方式 -->
    <button type="submit">确认选课</button>
</form>

内容的提问来源于stack exchange,提问作者user13372981

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:42:36