首页 > 解决方案 > Django——“输入一个有效的日期。” 更新模型时出错

问题描述

但是当我使用“runserver”命令重新启动服务器时,它只工作一次,但是当我再次尝试编辑模型时,它再次显示错误。DateTime 字段没有显示错误,我的项目中的所有模型都发生了同样的事情

Django 版本: Django-3.2.3 Python 版本: 3.8

我的错误 图片

我的模特

from django.db import models
from django.urls import reverse
from django.contrib.auth.models import User
from django.utils.timezone import now
from products.models import Products
from organizations.models import Persons, Companies

ORDER_STATUS_CHOICES = [
    ('Processing', 'Processing'),
    ('Confirmed', 'Confirmed'),
    ('Delivered', 'Delivered'),
]


def increment_order_number():
    last_order = Orders.objects.all().order_by('id').last()
    if not last_order:
        return 'FEO-0001'
    order_number = last_order.order_no
    order_int = int(order_number.split('FEO-')[-1])
    new_order_int = order_int + 1
    new_order_no = ''
    if new_order_int < 10:
        new_order_no = 'FEO-000' + str(new_order_int)
    if 100 > new_order_int >= 10:
        new_order_no = 'FEO-00' + str(new_order_int)
    if 100 <= new_order_int < 1000:
        new_order_no = 'FEO-0' + str(new_order_int)
    if new_order_int >= 1000:
        new_order_no = 'FEO-' + str(new_order_int)
    return new_order_no


# model for order
class Orders(models.Model):
    order_no = models.CharField(max_length=10, unique=True, default=increment_order_number)
    person_name = models.ForeignKey(Persons, on_delete=models.CASCADE, null=True)
    company_name = models.ForeignKey(Companies, on_delete=models.CASCADE, null=True)
    product_name = models.ForeignKey(Products, on_delete=models.CASCADE, null=True)
    total_weight = models.FloatField(max_length=10)
    rate_per_kg = models.FloatField(max_length=10)
    percentage_of_fotka = models.FloatField(max_length=10)
    percentage_of_moisture = models.FloatField(max_length=10)
    delivery_deadline = models.DateField(default=now)
    date_ordered = models.DateTimeField(default=now)
    added_by = models.ForeignKey(User, on_delete=models.CASCADE)
    order_status = models.CharField(max_length=20, null=True, choices=ORDER_STATUS_CHOICES, default='Processing')
    remarks = models.CharField(max_length=500, blank=True)

    def __str__(self):
        return str(self.order_no)

    @staticmethod
    def get_absolute_url():
        return reverse('order-list')

我的观点

from django.shortcuts import render
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import ListView, CreateView, UpdateView, DeleteView
from . import forms
from .models import Orders


class OrderCreateView(LoginRequiredMixin, CreateView):
    model = Orders
    template_name = 'orders/order_add_form.html'
    fields = ('order_no', 'person_name', 'company_name',
              'product_name', 'total_weight', 'rate_per_kg', 'percentage_of_fotka', 'percentage_of_moisture',
              'delivery_deadline', 'date_ordered', 'order_status', 'remarks')

    def form_valid(self, form):
        form.instance.added_by = self.request.user
        return super().form_valid(form)


class OrderListView(LoginRequiredMixin, ListView):
    model = Orders
    template_name = 'orders/order_list.html'
    context_object_name = 'orders'
    paginate_by = 20


class OrderUpdateView(LoginRequiredMixin, UpdateView):
    model = Orders
    template_name = 'orders/order_update_form.html'
    fields = '__all__'


class OrderDeleteView(LoginRequiredMixin, DeleteView):
    model = Orders
    template_name = 'orders/order_confirm_delete.html'
    success_url = '/order_list'

我的模板

{% extends "main/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="container">
        <h5 class="text-center">Update Order</h5>
        <form method="post" >
            {% csrf_token %}
            <div class="form-row">
            <div class="form-group col-md-6 mb-0">
                {{ form.order_no|as_crispy_field }}
            </div>
                <div class="form-group col-md-6 mb-0">
                {{ form.person_name|as_crispy_field }}
                </div>
                <div class="form-group col-md-6 mb-0">
                {{ form.company_name|as_crispy_field }}
                </div>
                <div class="form-group col-md-6 mb-0">
                {{ form.product_name|as_crispy_field }}
                </div>
                <div class="form-group col-md-6 mb-0">
                {{ form.total_weight|as_crispy_field }}
                </div>
                <div class="form-group col-md-6 mb-0">
                {{ form.rate_per_kg|as_crispy_field }}
                </div>
                <div class="form-group col-md-3 mb-0">
                {{ form.percentage_of_fotka|as_crispy_field }}
                </div>
                <div class="form-group col-md-3 mb-0">
                {{ form.percentage_of_moisture|as_crispy_field }}
                </div>
                <div class="form-group col-md-3 mb-0">
                {{ form.date_ordered|as_crispy_field }}
                </div>
                <div class="form-group col-md-3 mb-0">
                {{ form.delivery_deadline|as_crispy_field }}
                </div>
                <div class="form-group col-md-6 mb-0">
                {{ form.order_status|as_crispy_field }}
                </div>
                <div class="form-group col-md-6 mb-0">
                {{ form.remarks|as_crispy_field }}
                </div>
                <div class="form-group col-md-6 mb-0">
                {{ form.added_by|as_crispy_field }}
                </div>
            </div>
                <button class="btn btn-outline-info" type="submit">Update</button>
        </form>
    </div>
{% endblock content %}

标签: pythondjango

解决方案


在 settings.py 中设置DATE_INPUT_FORMATS如下:

DATE_INPUT_FORMATS = ['%Y-%m-%d']

或者

尝试这个:

widgets = {
    'delivery_deadline': forms.DateInput(format=('%Y-%m-%d'), attrs={'class':'form-control', 'placeholder':'Select a date', 'type':'date'}),
}

推荐阅读