我有以下在Django模板中手动呈现的表单。通过“手动渲染”,我的意思是代码中没有相应的Form或ModelForm对象(不使用Form对象的原因/细节有点复杂,可以安全地排除在这个问题之外)。我现在有一个心理障碍,我似乎无法弄清楚如何在Django视图中以可用的形式获取这些数据。具体来说,如何在表单张贴时为每个attendance_value
获取相应的attendance_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_value
attendance_remarks
和workers_pks
答案 0 :(得分:1)
使用请求对象的POST属性 -
def your_view(request):
#...
if attendence_value in request.POST:
at_value = request.POST['attendence_value']
但是我看到你有很多具有相同名称属性的输入(并且浏览器将使用输入名称作为键来构造帖子数据)。你需要改变它。我的回忆是,当django执行此操作(使用formsets)时,它会为每个名称添加一个前缀,以便它可以识别输入所属的对象。我看到你已经在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']
您可能想要使用不同的循环(可能通过输入循环)。但是你明白了。