我有一个表格,允许用户编辑他们的个人资料。其中一个字段是“出生日期”。在编辑时,表单会从数据库 (mySQL) 中获取日期,并以“1982 年 6 月 10 日”的格式显示。当我点击“提交”时,它会抛出错误:“输入有效日期。” 该字段是“只读”的,因此使用 datepicker 选择日期。我正在使用来自 eternicode 的日期选择器(https://github.com/eternicode/bootstrap-datepicker/)
为了呈现表单,我使用了crispy-forms (v1.2.3) 和 twitter-bootstrap。
使用日期选择器选择日期时,其格式为 mm/dd/yyyy。提交表单时会正确保存。
我在 SO 或其他地方找不到任何可以解决我的问题的东西。我觉得它应该是某个地方的一个小调整,但尽管有很多不同的方法,但无法确定它。
顺便说一句,如果我在'input'标签中指定 value="{{ field.value|date:'m/d/Y' }}" ,它将以这种格式显示日期并成功保存,但随后消失从小部件直到重新加载表单(可以通过刷新页面重新加载)
在 settings.py 中:USE_I18N、USE_L10N 和 USE_TZ 都设置为 'True',TIME_ZONE = 'Asia/Kolkata'
如果可能,我希望将显示日期保持为“1982 年 6 月 10 日”格式,并且仍然可以保存表单。否则,我不介意更改表单小部件中的显示日期格式。您的帮助将不胜感激。
这是我的相关代码片段:
models.py
class Profile(models.Model):
class Meta:
verbose_name_plural = _('Profiles')
user = models.OneToOneField(User, verbose_name=_('User'), related_name='enduser', unique=True)
dob = models.DateField(_('Date of Birth'), help_text=_(u"Age: 18yrs - 90yrs"))
:
:
表格.py
class ExtendedProfileForm(forms.ModelForm):
class Meta:
model = Profile
exclude = ('user',)
# some crispy forms related code
def __init__(self, *args, **kwargs):
super(ExtendedProfileForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_class = 'form-inline'
self.helper.form_tag = False
self.helper.html5_required = True
self.helper.help_text_inline = True
self.helper.attrs = {'accept-charset' : 'utf-8'}
fieldlist = self.fields.keys()
newlist = []
for key in fieldlist:
if key == 'dob':
newlist.append(Field("dob", css_class="input-small", readonly="readonly", id="id_dob", template="datepick.html", input_formats=(settings.DATE_INPUT_FORMATS)))
else:
newlist.append(key)
self.helper.layout = Layout(
Fieldset("",
*newlist
),
)
datepick.html
{% comment %}
Ref: https://github.com/maraujop/django-crispy-forms/issues/134
{% endcomment %}
{% load crispy_forms_field %}
<div id="div_{{ field.auto_id }}" class="clearfix control-group{% if field.errors %} error{% endif %}">
{% if field.label %}
<label for="id_{{ field.id_for_label }}" class="control-label {% if field.field.required %}requiredField{% endif %}"> {{ field.label|safe }}{% if field.field.required %}<span class="asteriskField">*</span>{% endif %} </label>
{% endif %}
<div class="controls">
<div id="{{ field.auto_id }}" class="input-append date" data-date-format="%m/%d/%Y">
<input size="40" type="text" readonly="readonly" {% if field.value %} value="{{ field.value }}"{% endif %} name="{% if form.prefix %}{{form.prefix}}-{% endif %}{{ field.name }}"/><span class="add-on"><i class="icon-calendar"> </i></span>
</div>
{% include 'bootstrap/layout/help_text_and_errors.html' %}
</div>
</div>
设置.py
DATE_INPUT_FORMATS = (
'%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', # '2006-10-25', '10/25/2006', '10/25/06'
'%b %d %Y', '%b %d, %Y', # 'Oct 25 2006', 'Oct 25, 2006'
'%d %b %Y', '%d %b, %Y', # '25 Oct 2006', '25 Oct, 2006'
'%B %d %Y', '%B %d, %Y', # 'October 25 2006', 'October 25, 2006'
'%d %B %Y', '%d %B, %Y', # '25 October 2006', '25 October, 2006'
)
JS 调用 datepicker
$('#id_dob').datepicker({
format : 'mm/dd/yyyy',
endDate : '-18y', // 18 years in the past
startDate : '-90y', // we assume a person to be max 90 years old to use this site
startView : 2,
autoclose : true,
});