【问题标题】:Django - Object not save date in the format i needDjango - 对象不以我需要的格式保存日期
【发布时间】:2017-09-03 16:23:15
【问题描述】:

(对不起,我的英语不好)

我在尝试保存日期时遇到问题,但仅在一个模型中,所有其他模型都完美地保存了日期。但是这个特定的模型节省了mm/dd/yyyy,我需要dd/mm/yyyy

这是模型

class CashClosing(models.Model):
    # Relations
    # Attributes - Mandatory
    date = models.DateField(
        verbose_name=_('date'),
    )
    cash_incomes = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        verbose_name=_('cash incomes'),
    )
    cash_expenses = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        verbose_name=_('cash expenses'),
    )
    cash_diff = models.DecimalField(
        max_digits=7,
        decimal_places=2,
        default=0,
        verbose_name=_('cash difference'),
    )
    real_cash = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        verbose_name=_('real cash'),
    )
    next_initial_cash = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        verbose_name=_('next initial cash'),
        help_text='Ingrese aquí el monto con el que abrirá la próxima caja'
    )
    balance = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        verbose_name=_('balance'),
    )
    # Attributes - Optional
    # Object Manager
    objects = managers.CashClosingManager()
    # Custom Properties

    # Methods
    def get_absolute_url(self):
        return reverse(
            'cash_closings:detail',
            kwargs={'id': self.id}
        )

    # Meta and String
    class Meta:
        verbose_name = _("Cash Closing")
        verbose_name_plural = _("Cash Closings")
        ordering = ('date',)

这是表格

class CashClosingForm(forms.ModelForm):

class Meta:
    model = CashClosing
    fields = [
        'date',
        'cash_diff',
        'next_initial_cash',
    ]

def __init__(self, *args, **kwargs):
    date = kwargs.pop('date')
    super(CashClosingForm, self).__init__(*args, **kwargs)

    self.helper = FormHelper()
    self.helper.layout = Layout(Field('date', type='hidden', value=date))
    self.helper.add_input(Submit(
        'submit',
        'Cerrar Caja',
        css_class="btn btn-primary btn-block")
    )

这里是视图

class CashClosingCreateView(CreateView):
model = CashClosing
form_class = CashClosingForm
template_name = "cash_closings/cashclose.html"

def dispatch(self, request, *args, **kwargs):

    d = self.request.GET['date']
    # Tomamos los gastos e ingresos del día
    self.today_incomes = Income.objects.today_incomes(day=d).aggregate(
        sum=Sum('amount')
    )['sum']
    self.today_expenses = Expense.objects.today_expenses(day=d).aggregate(
        sum=Sum('amount')
    )['sum']
    # Si no hay ingresos en el día se asigna 0
    if self.today_incomes is None:
        self.today_incomes = 0
    if self.today_expenses is None:
        self.today_expenses = 0

    self.today_balance = self.today_incomes - self.today_expenses

    # Tomamos la caja inicial si existe y sino seteamos 0
    try:
        last_cash_close = CashClosing.objects.latest('id')
        self.initial_cash = last_cash_close.next_initial_cash
    except ObjectDoesNotExist:
        self.initial_cash = 0

    if request.method.lower() in self.http_method_names:
        handler = getattr(
            self,
            request.method.lower(),
            self.http_method_not_allowed
        )
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)

def get_form_kwargs(self):

    kwargs = super(CashClosingCreateView, self).get_form_kwargs()
    kwargs.update({'date': self.request.GET['date']})
    return kwargs

def get_context_data(self, **kwargs):

    context = super(CashClosingCreateView, self).get_context_data(**kwargs)

    context['today_incomes'] = self.today_incomes
    context['today_expenses'] = self.today_expenses
    context['today_balance'] = self.today_balance
    context['initial_cash'] = self.initial_cash
    context['cash'] = self.today_balance + self.initial_cash

    return context

def form_valid(self, form, **kwargs):
    cc = form.instance
    # Asignamos los valores que no vienen con el formulario
    cc.cash_incomes = self.today_incomes
    cc.cash_expenses = self.today_expenses
    cc.real_cash = self.today_incomes - self.today_expenses + cc.cash_diff + self.initial_cash - cc.next_initial_cash
    cc.balance = self.today_incomes - self.today_expenses + cc.cash_diff

    return super(CashClosingCreateView, self).form_valid(form)

问题是这样的,例如我使用 get selected date 这样发送

cash-closings/create/?date=03%2F09%2F2017

我使用 JQueryUI datepicker 选择日期,这里是脚本

<script>
  $( function() {
    $( "#id_date" ).datepicker({
      dateFormat: 'dd/mm/yy'
    }).datepicker("setDate", new Date());
  } );
</script>

并把它放在隐藏的输入 HTML 中使用这个值

<input type="hidden" name="date" value="03/09/2017" id="id_date">

但是当我在 2017 年 3 月 9 日 (mm/dd/yyyy) 将其保存在 DB Django 商店中时

我不明白为什么,因为我拥有的所有其他型号都完美地存储了日期!

编辑:(临时修复)

我修复了它将我从 GET 收到的字符串转换为日期对象中的日期 dd/mm/yyy 在调度函数中使用它

d_string = self.request.GET['date']
d = datetime.datetime.strptime(d_string, '%d/%m/%Y').date()
self.d = d

这从现在开始解决了这个问题,但我仍然试图理解为什么这个模型可以节省糟糕的日期,因为所有其他形式和模型都可以完美运行。我收到想法。

【问题讨论】:

    标签: django django-models datepicker django-forms


    【解决方案1】:

    您应该在您的settings.py 中覆盖DATE_FORMAT

    USE_L10N = False
    DATE_FORMAT = 'd/m/Y'  # Your desired date format
    

    正如文档中所说:

    请注意,如果 USE_L10N 设置为 True,则区域设置指定的格式具有更高的优先级并将被应用。

    这就是为什么你也应该设置USE_L10N = False

    注意:这会全局设置日期格式。

    【讨论】:

    • 相同的结果,我将 L10N 设置为 False 并使用该日期格式 d/m/Y 并获得相同的结果,唯一的区别是现在 Django Admin 显示 09/02/2017(我尝试保存 2017 年 2 月 9 日),如果我使用 L10N True 管理员显示 2017 年 2 月 9 日...但存储在 Db 中的数据仍然很糟糕
    • 我在表单中添加了打印并且日期完美我得到了这个 02/09/2017 并在 form_valid 函数中添加了其他打印并且日期存在问题:2017-02- 09
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2023-04-06
    • 2014-08-01
    • 1970-01-01
    相关资源
    最近更新 更多