数据库中的数据格式值更改

时间:2013-06-15 11:17:29

标签: django django-models django-forms django-views

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日。它无法正常工作。

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

由于

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)

啊,旧日期格式化问题。您是否考虑以[时间戳格式[(Are unix timestamps the best way to store timestamps?)存储所有日期,然后在显示/保存时正确格式化它们。

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

答案 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()

保存表单后,您的客户端发送了什么格式?