2013-02-17 35 views
1

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

<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

+0

为什么不使用FormSet? https://docs.djangoproject.com/en/dev/topics/forms/formsets/ – 2013-02-17 09:32:36

回答

1

使用请求对象的属性POST -

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

但是我看到你有很多的投入名称相同的属性(浏览器会使用输入的名称作为构建数据后键)。你需要改变它。我的回忆是,当Django这样做(使用formset)时,它会为每个名称添加一个前缀,以便它可以识别输入属于哪个对象。我看到你已经在ID上做了这个。

UPDATE

如何将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'] 

您可能需要使用不同的循环(也许循环输入)。但你明白了。

+0

是的,我的意思是如果我在该循环中有100次迭代,我如何为每个'workers_pks获得'attendance_value'和'attendance_remarks' **分别** – chefsmart 2013-02-17 08:30:50

+0

我已添加更新。 – 2013-02-17 08:54:38

+0

@AidanEwen'name ='attendance_value [{{result.worker.pk}}]'''怎么样? – 2013-02-17 09:30:40