1

我有以下在 Django 模板中手动呈现的表单。“手动渲染”是指代码中没有对应的 Form 或 ModelForm 对象(不使用 Form 对象的原因/细节有点复杂,可以安全地排除在这个问题之外)。我现在有一个心理障碍,我似乎无法弄清楚如何在 Django 视图中以可用的形式获取这些数据。具体来说,当表单发布时,我如何获得相应的attendance_valueattendance_remarks每个?workers_pks

<form>
<table>
    <thead>
        <tr>
            <th>Sl</th>
            <th>Worker</th>
            <th>Worker's Gender</th>
            <th>Work</th>
            <th>Unit cost of work</th>
            <th>Job</th>
            <th>Attendance</th> {# 1 or less if unit is day, 8 or less if unit is hours #}
            <th>Remarks</th> {# if any #}
        </tr>
    </thead>
    <tbody>
    {% for result in results %}
        <tr>
            <th>{{ forloop.counter }}</th>
            <td>{{ result.worker.name }} <input type="hidden" name="workers_pks" value="{{ result.worker.pk }}" id="id_workers_pks_{{ forloop.counter }}"></td>
            <td>{{ result.worker.get_gender_display }}</td>
            <td>{{ result.work.name }}</td>
            <td>{{ result.work.unit_cost }} per {{ result.work.work_unit }}</td>
            <td>{{ result.job_handover.job.name }}</td>
            <td>
                <input type='text' name='attendance_value' id='id_attendance_value_{{ forloop.counter }}' />
            </td>
            <td>
                <input type='text' name='attendance_remarks' id='id_attendance_remarks_{{ forloop.counter }}' />
            </td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</form>

只是为了澄清,我知道我可以通过做类似的事情来获得价值

workers = request.POST.getlist('workers_pks')

attendance_values = request.POST.getlist('attendance_values')

attendance_remarks = request.POST.getlist('attendance_remarks')

我主要关心的是如何获得正确的attendance_valueattendance_remarks每个对应的workers_pks

4

1 回答 1

1

使用请求对象的 POST 属性 -

def your_view(request):
    #...
    if attendence_value in request.POST:
        at_value = request.POST['attendence_value']

但是,我看到您有很多具有相同名称属性的输入(并且浏览器将使用输入名称作为键来构造发布数据)。你需要改变它。我的回忆是,当 django 这样做时(使用表单集),它会为每个名称添加一个前缀,以便它可以识别输入所属的对象。我看到你已经在 ids 上做了这个。

更新

worker.pk添加到您的name属性中怎么样-

<input type='text' name='attendance_value{{ result.worker.pk }}'>

然后在您的视图中构建相应的字符串 -

for worker in workers: 
    val_str = "attendance_value" + str(worker.pk)
    rmk_str = "attendance_remarks" + str(worker.pk)
    if val_str in request.POST:
        worker.attendance_value = request.POST['val_str']
    if mrk_str in request.POST:
        worker.attendance_remarks = request.POST['rmk_str']

您可能想要使用不同的循环(可能是通过输入循环)。但你明白了。

于 2013-02-17T08:11:52.957 回答