4

表格.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.日期格式应根据数据库中的值更改,如果值在db中,则显示第一种格式,对于无,其他部分正在执行。

2.格式根据情况而变化。

3.我在这里遇到问题,如果输入格式是这样的(%m/%d/%Y),在表单上,​​日期的值会被交换并保存在数据库中。如果给定的日期是 07/06/2013 --> 2013 年 6 月 7 日,表单发布后在字段中显示为 06/07/2013 -->2013 年 7 月 6 日。它无法正常工作。

需要帮助来解决这个问题。

谢谢

4

6 回答 6

5

最简单的解决方案是创建用于呈现表单的工厂:

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')

日期应仅在小部件的呈现阶段更改为字符串,在其他地方将它们保留为日期时间或日期对象

于 2013-06-21T10:02:58.983 回答
4

这是另一种动态更改输入格式的方法

表格.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, )  

视图.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))

input_formats创建表单时动态更改 DateField 属性的关键。因此,当您提交表单时,您应该传递date_format并且默认的 DateField 应该可以很好地转换您的日期。您将不得不将此代码改编为您的代码,因为我已经在上面的代码中假设了一些内容。

于 2013-06-18T18:01:17.667 回答
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'}))

我不知道dateformatflag是从哪里来的,所以可能会引起一些麻烦。

注意:我刚刚注意到小部件是只读的。为什么要将其添加到表单中?如果您只在模板中显示日期会简单得多。

注意2:您应该注意几件事:您 d/m/Y 在小部件和日期选择器中设置了格式,这些可能会引起麻烦。您应该在表单中将日期实例作为初始值传递,这样会更好。

于 2013-06-17T16:05:45.650 回答
1

啊,旧的日期格式问题。您是否考虑过以 [时间戳格式 [(unix 时间戳是存储时间戳的最佳方式吗?)存储所有日期,然后在显示/保存时正确格式化它们。

我建议您始终以某种格式显示日期,并确保日期以相同格式从视图中返回。对于输入表单,提供多样性是不值得的。

于 2013-06-17T14:29:54.600 回答
1

您应该依靠 Django > 1.2 功能来本地化日期格式,而不是重新发明轮子。Django 以本地化格式处理输出日期,以及处理带有本地化日期的表单提交。您只需要让用户能够设置他/她想要的语言环境,Django 就会自己处理不同的格式。 https://docs.djangoproject.com/en/1.4/topics/i18n/formatting/

于 2013-06-24T07:38:44.590 回答
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()

保存表单后发送给客户的格式是什么?

于 2013-06-15T17:22:09.243 回答