我有一个名为ItemBatch
# item upload
class ItemBatch(models.Model):
ttypes =(('Open','Open'),('Container','Container'),('Trailer','Trailer'),('All','All'))
uploaded_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='uploaded_by')
name = models.CharField(max_length=30)
pid = models.IntegerField(blank=True)
quantity = models.IntegerField(blank=True)
length = models.FloatField(blank=True)
width = models.FloatField(blank=True)
height = models.FloatField(blank=True)
volume = models.FloatField(blank=True)
weight = models.FloatField(blank=True)
truck_type = models.CharField(max_length=255,default=0, choices=ttypes)
origin = models.CharField(max_length=100, blank=True)
destination = models.CharField(max_length=100, blank=True)
time = models.DateTimeField(max_length=100, blank=True,default=now)
rtd = models.BooleanField(default=False) #ready to dispatch checkbox
def __str__ (self):
return self.name
我正在使用此视图函数来呈现它:
@method_decorator([login_required, teacher_required], name='dispatch')
class UploadedItems(ListView):
model = ItemBatch
ordering = ('name',)
context_object_name = 'items'
template_name = 'classroom/teachers/item_list.html'
def get_queryset (self):
return ItemBatch.objects.filter(uploaded_by=self.request.user)
我正在将此模板呈现在模板中并得到此信息:
这是模板中的代码:
{% for quiz in last %}
<tr>
<form method="post" novalidate>
{% csrf_token %}
<td class="align-middle"><input type="checkbox" value="{{ quiz.pid }}"></td>
<td class="align-middle">{{ quiz.name }}</td>
<td class="align-middle">{{ quiz.pid }}</td>
<td class="align-middle">{{ quiz.quantity }}</td>
<td class="align-middle">{{ quiz.length }}x{{ quiz.width }}x{{ quiz.height }}</td>
<td class="align-middle">{{ quiz.volume }}/{{ quiz.weight }}</td>
<td class="align-middle">{{ quiz.origin }}</td>
<td class="align-middle">{{ quiz.destination }}</td>
<td class="align-middle">{{ quiz.time|naturaltime }}</td>
</form>
</tr>
{% empty %}
如您所见,我在表中创建了一个表单,并且还包含一个复选框。但是,我无法以任何方式获取该复选框的输出。如何让用户选择一些项目,并以任何方式将数据返回给我,以便可以将其用于其他功能?如果该复选框仅能给我id或pk值,则可以使用适当的对象将其反转,但是我无法在已经是另一个函数的输出呈现的表上创建输入表单。这是正确的方法吗?
答案 0 :(得分:1)
您可以在表单末尾添加一个提交按钮,并在表单标签内指定操作并将其映射到Django视图。
此外,您需要在for循环之外删除表单标签。
应如下所示:
page 1496 - 10
page 1497 - 5
page 1498 - 0
page 1499 - 0
page 1500 - 0
page 1501 - 10
在您的网址中添加路径:
<form method="post" action="{% url 'your_url_name'%}" novalidate>
{% csrf_token %}
{% for quiz in last %}
<tr>
<td class="align-middle"><input name='quiz-pids' id='checkbox-{{forloop.counter}}' type="checkbox" value="{{ quiz.pid }}"></td>
<td class="align-middle">{{ quiz.name }}</td>
<td class="align-middle">{{ quiz.pid }}</td>
<td class="align-middle">{{ quiz.quantity }}</td>
<td class="align-middle">{{ quiz.length }}x{{ quiz.width }}x{{ quiz.height }}</td>
<td class="align-middle">{{ quiz.volume }}/{{ quiz.weight }}</td>
<td class="align-middle">{{ quiz.origin }}</td>
<td class="align-middle">{{ quiz.destination }}</td>
<td class="align-middle">{{ quiz.time|naturaltime }}</td>
</tr>
{% endfor %}
<input type="submit" value='Do something'>
</form>
您的视图:
path('your-url', views.YourView.as_view(), name='your_url_name'),
答案 1 :(得分:0)
这里有两件事是错误的。
首先,您需要围绕所有选项使用一个表单,而不是每行一个表单。
其次,在输入元素中需要一个name
属性,以便浏览器知道如何将其发送到后端。
<form method="post" novalidate>
{% csrf_token %}
{% for quiz in last %}
<tr>
<td class="align-middle"><input type="checkbox" name="pids" value="{{ quiz.pid }}"></td>
...
</tr>
{% endfor %}
<input type="submit">
</form>
现在,在您的视图中,您可以通过self.request.POST.getlist('pids')
获取提交的值-例如,您可以使用它通过ItemBatch.objects.filter(pid__in=self.request.POST.getlist('pids'))
来过滤查询集。