【问题标题】:Creating year dropdown in Django template在 Django 模板中创建年份下拉列表
【发布时间】:2012-12-18 14:39:52
【问题描述】:

我想在 django 模板中创建一个年份下拉列表。下拉列表将包含起始年份为 2011 年,结束年份应为当前年份的 5 年。

例如:如果今天我看到 dropdwon,它将显示从 2011、2012、2013、...2017 年的年份。

可以通过从views.py发送一个列表并在模板中循环或在forms.py中定义来完成。

但我不想在这里使用任何形式。我只需要在模板中显示它。

我如何在 Django 模板中做到这一点。

【问题讨论】:

    标签: python django django-templates


    【解决方案1】:

    在你的models.py...

    import datetime
    
    year_dropdown = []
    for y in range(2011, (datetime.datetime.now().year + 5)):
        year_dropdown.append((y, y))
    

    所以,您的字段现在可以使用year_dropdown

    year = models.IntegerField(_('year'), max_length=4, choices=year_dropdown, default=datetime.datetime.now().year)
    

    将当前年份设置为默认值。

    如果您想要的只是模板中的值,请执行以下操作...

    <select id="year">
    {% for y in range(2011, (datetime.datetime.now().year + 5)) %}
        <option value="{{ y }}">{{ y }}</option>
    {% endfor %}
    </select>
    

    更多详情,请阅读Django template language documentation

    【讨论】:

    • 问题中提到他不想使用表单。
    • 嘿,伊恩,我不想在这里使用任何类型的视图、模型或表单,因为数据不会保存在任何地方。我只想显示 dropdwon 并在选择年份时从 db 中提取该年份的数据。那么我们可以从客户端本身来做吗。
    • Ian 通过在我的模板(html 页面)中添加上面的代码,我收到了这个错误消息 -> 'for' 语句应该使用格式'for x in y': for y in range(2011 , (datetime.datetime.now().year + 5))
    • 糟糕,我包含了:,我认为这是您的错误的原因。看到if 语句末尾的冒号了吗?删除它,看看会发生什么。
    • 嗨,戈登,我喜欢你的第一个答案。使用类似的方法,我遇到了一个情况,我的服务器几个月没有重新启动,因此我选择的年份没有更新。您能否删除您的第二个答案,因为您无法在 Django 模板中运行普通的 python 代码并且您的文本现在具有误导性?谢谢!
    【解决方案2】:

    我建议在客户端使用 Javascript 或 jQuery 来根据当前年份填充下拉列表。

    【讨论】:

      【解决方案3】:
      <select name="select_year">
      <option>2011</option>
      <option>2012</option>
      <option>2013</option>
      <option>2014</option>
      <option>2015</option>
      <option>2016</option>
      <option>2017</option>
      </select>
      

      把它放在你的模板文件中......如果你想做一个动态的年份范围,你需要制作你自己的模板标签

      这个线程有几个实现范围类型功能作为模板标签的答案

      Numeric for loop in Django templates

      使用 javascript 解决方案可能是动态设置范围的最简单方法。

      【讨论】:

      • 不,我不能这样做,因为当 2014 年到来时,我必须显示 2011、2012、2013、2014...2018 的年份。你能建议我如何通过编写模板标签来完成它。谢谢
      【解决方案4】:

      这就是我喜欢的方式。

      models.py:

      YEAR_CHOICES = []
      for r in range(2011, (datetime.datetime.now().year+5)):
          YEAR_CHOICES.append((r,r))
      
      year = models.IntegerField(('year'), max_length=4, choices=YEAR_CHOICES, default=datetime.datetime.now().year)
      

      【讨论】:

      • 我不想在这里使用任何服务器端代码。我们可以在模板本身中做到这一点吗?
      • 如果你不想要任何服务器端代码,那么这个问题并不是关于使用 django。您可以按照某人的建议仅使用 html 或 jquery 轻松创建选择框。但是如果没有保存到数据库中,我不确定让用户输入数据的目的..
      • 另一方面,如果您只是想将其排除在模型和视图文件之外,我们可以讨论为此过程创建一个模板标签。
      • 它不是数据库的用户输入,它是用于从数据库中提取数据的下拉菜单。因此不需要使用模型或表格。是的,您对使用模板标签是正确的,这肯定会有所帮助。但我是 Django 的新开发人员,所以对编写模板标签没有太多想法。如果你能帮助编写一个很棒的模板标签。:)
      【解决方案5】:

      如果您想要的只是年份本身的下拉列表,您可以按照@Nick 或@Ian 的建议进行操作。如果您需要一些日历类型功能(日期选择器),您可以查看JQuery UI DatePicker

      【讨论】:

      • 这可能是比我的 tbh 更好的解决方案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2012-12-16
      • 2014-08-07
      • 1970-01-01
      • 2014-07-22
      • 2011-04-12
      相关资源
      最近更新 更多