forms.py
DATE_INPUT_FORMAT = (
('%d/%m/%Y','%m/%d/%Y')
)
class ReportForm(forms.ModelForm):
manual_date = forms.DateField(input_formats = DATE_INPUT_FORMAT,
widget=forms.DateInput(format = '%d/%m/%Y'))
1.Date格式应该根据数据库中的值进行更改,如果value在db中,则显示第一种格式,不显示,否则部分正在执行。
2.格式正在发生变化取决于条件。
3.我在这里面临问题,如果输入格式为此(%m /%d /%Y),则在表单上,日期值将被交换并保存在数据库中。如果给定日期为07 / 06/2013 - > 2013年6月7日,在表格发布后,它在现场被视为06/07/2013 - > 2013年7月6日。它无法正常工作。
需要帮助来解决这个问题。
由于
答案 0 :(得分:6)
最简单的解决方案是创建工厂以呈现表单:
def ReportFormFactory(date_format):
class ReportForm(forms.ModelForm):
manual_date = forms.DateField(
input_formats=[date_format],
widget=forms.DateInput(format=date_format)
)
return ReturnForm
然后在视图中:
if int(dateformat):
ReportForm = ReportFormFactory('%m/%d/%Y')
else:
ReportForm = ReportFormFactory('%d/%m/%Y')
日期应仅在窗口小部件的presention阶段更改为字符串,在其他地方将它们保留为日期时间或日期对象
答案 1 :(得分:5)
这是另一种动态更改输入格式的方法
<强> forms.py:强>
class ReportForm(forms.Form):
manual_time = forms.TimeField(input_formats = TIME_INPUT_FORMAT,
widget=forms.TimeInput(attrs={'size':'8','class':'time_field'}))
manual_date = forms.DateField(widget=forms.DateInput(
attrs={'size':'15', 'id':'datepicker'}))
def __init__(self, *args, **kwargs):
# Get the date_format if present in parameters
date_format = None
if 'date_format' in kwargs:
date_format = kwargs.pop('date_format')
super(ReportForm, self).__init__(*args, **kwargs)
# Dynamically set input date format
if date_format:
self.fields['manual_date'].input_formats = (date_format, )
<强> views.py 强>
def when(request):
"""To view and save report time and date
"""
if not 'report_id' in request.session:
return redirect('incident.views.new_report')
report_id = request.session['report_id']
report = Report.objects.get(pk=report_id)
try:
settings = Settings.objects.get(user=request.user)
dateformat = settings.date_format
timeformat = settings.time_format
except:
dateformat = False
timeformat = False
date = None
time = None
if not report.manual_date:
report.manual_date = datetime.datetime.now()
if not report.manual_time:
report.manual_time = datetime.datetime.now()
manual_date = datetime.datetime.now()
if int(dateformat):
date_format = '%m/%d/%Y'
datelabel = "Date(mm/dd/yyyy)"
createddate = report.created_date_time.strftime('%b %d %Y')
else:
date_format = '%d/%m/%Y'
datelabel = "Date(dd/mm/yyyy)"
createddate = report.created_date_time.strftime('%d %b %Y')
date = report.manual_date.strftime(date_format)
if int(timeformat):
time = report.manual_time.strftime('%H:%M')
timelabel = "Time(24hour)"
createdtime = report.created_date_time.strftime('%H:%M')
else:
time = report.manual_time.strftime('%I:%M %p')
timelabel = "Time(12hour)"
createdtime = report.created_date_time.strftime('%I:%M %p')
if request.method == 'POST':
reportform = ReportForm(request.POST, date_format=date_format)
if reportform.is_valid():
report.manual_date = reportform.cleaned_data['manual_data']
report.manual_time = reportform.cleaned_data['manual_time']
report.user = request.user
report.save()
if not 'next' in request.POST:
return redirect('incident.views.report_confirm')
return redirect('incident.views.media')
else:
reportform = ReportForm(instance=report, initial={'manual_date':date, 'manual_time':time})
leftbar = common_leftbar(request, report_id)
return render_to_response('incident/when.html',
{
'newreport_menu': True,
'when_tab': True,
'reportform': reportform,
'datelabel':datelabel,
'timelabel':timelabel,
'createddate':createddate,
'createdtime':createdtime,
'incident': report,
'leftbar':leftbar
},
context_instance=RequestContext(request))
此处的关键是在创建表单时动态更改DateField的input_formats
属性。因此,当您提交表单时,您应该传递date_format
并且默认的DateField应该将您的日期转换为罚款。您将不得不将此代码调整为您的代码,因为我已经在上面的代码中假设了一些内容。
答案 2 :(得分:3)
我认为你需要继承DateField
并覆盖strptime
方法来做你想做的事。
class MyDateField(forms.DateField):
def strptime(self, value, format):
# Ignore format and continue by your dateformat
if int(dateformat):
date = datetime.datetime.strptime(force_str(value), '%m/%d/%Y').date()
else:
date = datetime.datetime.strptime(force_str(value), '%d/%m/%Y').date()
# Output for debugging
print "Raw input: '%s', dateformat: %s, date: %s" % (value, dateformat, date)
return date
class ReportForm(forms.ModelForm):
manual_date = MyDateField(widget=forms.DateInput(format='%d/%m/%Y',
attrs='size':'15', 'id':'datepicker', 'readonly':'readonly'}))
我不知道dateformat
标志来自何处,因此可能会造成一些麻烦。
注意:我刚注意到该小部件是只读的。为什么要将其添加到表单中?如果你只是在模板中显示日期会更简单。
注2:您应该注意以下几点:您在窗口小部件和日期选择器中设置了 d/m/Y
格式,这些可能会导致麻烦。您应该将日期实例作为表单中的初始值传递,这应该会更好。
答案 3 :(得分:1)
我建议您始终以特定格式显示日期,并确保日期以相同格式从视图中返回。对于输入表格,提供多样性是不值得的麻烦。
答案 4 :(得分:1)
你应该依赖Django&gt;而不是重新发明轮子。 1.2本地化日期格式的能力。 Django处理本地化格式的输出日期以及处理具有开箱即用的本地化日期的表单提交。您只需要为用户提供设置他/她所需语言环境的功能,Django就可以自己处理不同的格式。 https://docs.djangoproject.com/en/1.4/topics/i18n/formatting/
答案 5 :(得分:0)
尝试更清楚您的代码:
reportform = ReportForm(request.POST or None,
instance=report,
initial={'manual_date':date, 'manual_time':time})
if reportform.is_valid():
report = reportform.save(commit=False)
report.user = request.user
report.save()
保存表单后,您的客户端发送了什么格式?