【问题标题】:how to increase the range of years to show up in Django templates?如何增加显示在 Django 模板中的年份范围?
【发布时间】:2014-04-24 22:01:48
【问题描述】:

在我正在创建的signUp 表单中,我将date-of-birth field 预填充到“昨天”。 但是一年的scroll down menu 限制为9 年。我怎样才能增加出现的年数。它不能被限制。我附上了图片。你可以看到只有这九年中有一个option to choose。任何想法如何解决这个问题?

signups/forms.py:

from django import forms
from signups.models import SignUp
import datetime
from django.forms.extras.widgets import SelectDateWidget

def yesterday():
    yesterday = (datetime.date.today() - datetime.timedelta(1))
    return yesterday

class SignUpForm(forms.ModelForm):
    date_of_birth = forms.DateField(widget=SelectDateWidget(), initial=yesterday)
    class Meta:
        model=SignUp

signups/models.py:

from django.db import models 
from django.utils.encoding import smart_unicode
from blogapp.models import Post


class SignUp(models.Model):
    #null in database
    first_name=models.CharField(max_length=100,null=True,blank=True)
    last_name=models.CharField(max_length=100,null=True,blank=True)
    #default is null=false, blank=false, email is necessary
    email=models.EmailField(unique=True)
    #when created make timestamp but not when updated
    timeStamp=models.DateTimeField(auto_now_add=True,auto_now=False)
    updated=models.DateTimeField(auto_now_add=False,auto_now=True)
    is_active=models.BooleanField()
    date_of_birth=models.DateTimeField()
    myPosts=models.ManyToManyField(Post)


    def __unicode__(self):
        return smart_unicode(self.email,encoding='utf-8',strings_only=False,errors='strict')

signup/views.py:

def signup_view(request):
    form=SignUpForm(request.POST or None)
    if form.is_valid():
        save_it=form.save(commit=False)
        save_it.save()
        messages.success(request, "Thank you for signing up")
        return HttpResponseRedirect("/accounts/register_success")
    else:
        args={}
        args['form']=form
        return render(request,"signup.html",args)

templates/signup.html:

{% extends "base.html" %}

{% block content %}
<h2>Join Now</h2>
<form action="" method="post">{% csrf_token %}

{{ form.as_p }}

<input type="submit" value="register"/>

</form>
{% endblock %}

【问题讨论】:

  • 不能有限制。它必须,该小部件在html 中呈现为optionsselect 标记内。

标签: django django-models django-forms django-templates


【解决方案1】:

您可以将年份参数传递给 SelectDateWidget,如下所示:

SelectDateWidget(years=range(1900, 2100))

虽然这不会接受无限范围,但在大多数情况下应该可以。

Documentation,开发版也可以加月份限制:)

如果你想随着时间动态改变范围,你可以做类似这样的事情:

from datetime import datetime
## range would be the difference between the current year, 
## and the farthest year into the future or past you would want to include.
date_range = 100    
this_year = datetime.now().year
     ### django code here ###

 SelectDateWidget(years=range(this_year - date_range, this_year + date_range))

【讨论】:

  • 好答案,您可以将链接添加到小部件的文档以确保完整性:)
  • 我猜这需要维护。说l0年后,你想增加范围。您必须提取此代码并进行更改。那是理想的吗?
  • @eagertoLearn 你可以把range改成range(datetime.now().year - 80, datetime.now().year)
  • lennart:这有帮助,谢谢。只是为了让您知道,因为 range 是 python 中的关键字,因此不允许分配。我相信你知道。
  • @eagertoLearn 很高兴你注意到了这一点,也对 Paulo Bu 表示敬意
猜你喜欢
  • 2011-09-09
  • 2021-08-21
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多