如何以表格形式呈现模型,并使用django复选框选中其中的一些模型?

时间:2019-05-14 13:56:09

标签: django checkbox django-models django-forms django-views

我有一个名为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)

我正在将此模板呈现在模板中并得到此信息:

img

这是模板中的代码:

{% 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值,则可以使用适当的对象将其反转,但是我无法在已经是另一个函数的输出呈现的表上创建输入表单。这是正确的方法吗?

2 个答案:

答案 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'))来过滤查询集。