【问题标题】:Looping in Django forms在 Django 表单中循环
【发布时间】:2010-09-22 20:14:42
【问题描述】:

我刚刚开始在 Django 中构建原型应用程序。我通过Django app tutorial on the Django site 开始工作,这非常有帮助,并为我提供了入门所需的内容。现在我有几个我希望是非常简单的问题:

我想在views.py 中放置一个循环,循环遍历从表单传入的一组变量。所以我在 HTML 表单中有很多项目,每个项目都有一个 SELECT 下拉列表,供人们选择 0-10 的分数,如下所示:

<select name="score1">
  <option value=0 SELECTED>No score</option>
  <option value=1>1</option>
  <option value=2>2</option>
  <option value=3>3</option>
  <option value=4>4</option>
  <option value=5>5</option>
  <option value=6>6</option>
  <option value=7>7</option>
  <option value=8>8</option>
  <option value=9>9</option>
  <option value=10>10</option>
</select>

所以我有 100 个这样的变量,score1、score2、score3、...、score99、score100。提交表单时,我想遍历这些变量中的每一个并查看它是否已设置(即不是 0),如果是,我想将该值存储在数据库中的合适位置。我的问题是我不知道如何遍历这些变量。 我猜我想要这样的东西:

for o in request.POST.all

endfor

但是我真的不知道该怎么办。

我不是在找人为我编写代码,真的:我只是想要一些关于如何在 python / Django 中编写这样的循环的指导,也许还有一些关于我的好参考指南的指针可以在线查看或购买,这将使我能够访问这种东西。

另外,上面的选择对象我几乎是手动创建的,我真的很希望能够使用循环首先在模板中生成它。我的模板目前有这个:

<table>
{% for movie in movie_list %}
  <tr>
  <td> {{ movie }} </td>
  <td>
       <select name="score{{ movie.id }}">
         <option value=0 SELECTED>No score</option>
         <option value=1>1</option>
         <option value=2>2</option>
         <option value=3>3</option>
         <option value=4>4</option>
         <option value=5>5</option>
         <option value=6>6</option>
         <option value=7>7</option>
         <option value=8>8</option>
         <option value=9>9</option>
         <option value=10>10</option>

       </select>
  </td></tr>

{% endfor %}
</table>

我觉得必须有一种方法可以创建一个从 1 计数到 10 的简单循环,它会为我生成大部分选项,但我不知道该怎么做...

【问题讨论】:

    标签: python django


    【解决方案1】:

    你需要查看 Django forms。

    你不应该这样构建自己的表单。

    您应该声明一个包含ChoiceField 的Form 类,并为该字段提供选择域。一切都会从那里自动发生。

    顺便说一句,选项应该在您的模型中定义为该模型字段的值范围。

    您的页面仅包含{{form}}。 Django 使用选项构建表单并将选项解码为最终结果。

    【讨论】:

      【解决方案2】:

      我觉得一定有办法 创建一个简单的循环,从 1 到 10 会产生大部分 这些选项对我来说,但我不能 弄清楚如何做到这一点......

      如果您不想使用 Django 表单(为什么是 btw?),请查看此 custom range tag 或将 range(1, 11) 对象传递到您的模板并在 {% for %} 循环中使用它。

      【讨论】:

      • 啊...你的回答让我觉得有点意思:我认为你不能将 python 代码放入模板中是对的吗?只有 Django 模板语言?
      • 是的。在行动中分离关注点;)
      【解决方案3】:

      遵循 S.Lotts 关于表单的建议,从长远来看,现在以 Django 的方式进行操作会节省时间。对于您正在寻找的那个循环:

      <select name="score{{ movie.id }}">
          <option value=0 SELECTED>No score</option>
        {% for i in range(1, 11) %}
          <option value={{ i }}>{{ i }}</option>
        {% endfor %}
      </select>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 2019-07-21
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多