【问题标题】:How to render a model in table form, and select some of them using checkbox using django?如何以表格形式呈现模型,并使用 django 使用复选框选择其中一些?
【发布时间】:2019-05-14 13:56:08
【问题描述】:

我有一个模型叫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 值,我将能够使用适当的对象将其反转,但我无法在已经是另一个函数的输出渲染的表上创建输入表单。这是正确的方法吗?

【问题讨论】:

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


    【解决方案1】:

    您可以在表单末尾添加一个提交按钮,并在表单标签内指定操作并将其映射到 django 视图。

    此外,您需要将表单标签移出 for 循环。

    应该是这样的:

    <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'),
    

    您的看法:

    class YourView(View):
        def post(self, request, *args, **kwargs):
            #get the selected quizs
            quizs = request.POST.getlist('quiz-pids')
            #retrieves thoses quizes from the database:
            items = ItemBatch.objects.filter(pid__in=quizs)
            #do something with each of them:
            for item_batch in items:
                #do something
                pass
    

    【讨论】:

    • 我能够选择项目,但它向我显示此错误The view classroom.views.teachers.UploadedItems didn't return an HttpResponse object. It returned None instead。如何解决这个问题??
    • 另外,我不明白 urls.py 部分。我已经有了使用 path('myitems/', teachers.UploadedItems.as_view(), name='upload_batch'),UploadedItems 函数。我要在那里添加新功能帖子吗?
    • 您需要创建一个新视图并添加与该视图对应的新url
    • 谢谢!它对我有用。不过,我没有创建新视图。但是,我想知道,当函数返回项目的 Pid 时,我将它们转换为对象并将对象的查询集传递给我的另一个函数,但它无法这样做。有任何想法吗 ?错误提示'list' object has no attribute 'user' 我应该发布另一个问题吗?我传递给的函数与user 根本没有任何关系......
    • 你应该发布另一个问题,在那里你可以显示你有一个新问题的新代码。如果您编辑帖子,那么答案将与帮助未来的人无关。
    【解决方案2】:

    这里有两个问题。

    首先,您需要一个包含所有选项的表单,而不是每行一个表单。 其次,您需要在输入元素中添加一个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')) 过滤查询集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      相关资源
      最近更新 更多