DRF DateField - 保存表单时出错:日期格式错误。请改用以下格式之一:YYYY-MM-DD
DRF DateField - error when saving form: Date has wrong format. Use one of these formats instead: YYYY-MM-DD
我正在将表单发布到我的 Django Rest Framework 后端。
我正在使用一个 DateField,它是可选的,具体取决于用户正在查看的表单类型。
当用户可以看到 DateField 和 select 日期时,它会正确提交并且没有问题。
当 DateField 被隐藏时,我在提交表单时收到格式错误(但不应该)
表单通过 HTML 适当地呈现元素:
当日期可见时:
<div class="mt-2 text-center">
<input type="hidden" name="summative" value="127" id="id_summative">
<input type="hidden" name="evaluation_type" value="31" id="id_evaluation_type">
<div id="id_evaluation_levelFormGroup" class="form-group">
<label class="form-label" for="id_evaluation_level">Evaluation level</label>
<select name="evaluation_level" class="form-control" required="" id="id_evaluation_level">
<option value="" selected="">---------</option>
<option value="41">Formal</option>
<option value="42">Informal</option>
</select>
</div>
<div id="id_evaluation_dateFormGroup" class="form-group">
<label class="form-label" for="id_evaluation_date">Evaluation date</label>
<input type="date" name="evaluation_date" value="2021-09-08" class="form-control" id="id_evaluation_date">
</div>
</div>
隐藏时:
<div class="mt-2 text-center">
<input type="hidden" name="summative" value="127" id="id_summative">
<input type="hidden" name="evaluation_type" value="33" id="id_evaluation_type">
<input type="hidden" name="evaluation_level" value="43" id="id_evaluation_level">
<input type="hidden" name="evaluation_date" id="id_evaluation_date">
</div>
evaluation_date
不是必填字段,模型属性如下所示:
evaluation_date = models.DateField(
auto_now=False, auto_now_add=False, null=True, blank=True
)
我的序列化器看起来像这样(包括日期的验证方法):
class EvaluationSerializer(serializers.ModelSerializer):
def validate_evaluation_date(self, attrs):
# Get the date string
date_string = self.context["request"].data["evaluation_date"]
# Get the type
evaluation_type_id = self.context["request"].data["evaluation_type"]
evaluation_type = EvaluationType.objects.get(id=evaluation_type_id)
# If we have an Observation, blanks should not be allowed
if evaluation_type.name == "Observation" and attrs == None:
raise serializers.ValidationError("This field is required.")
if evaluation_type.name == "Observation" and attrs == "":
raise serializers.ValidationError("This field is required.")
# Parse the string into a date object
date = datetime.strptime(date_string, "%Y-%m-%d").date()
return date
absolute_url = serializers.SerializerMethodField()
created_by = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
updated_by = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
evidences = serializers.SerializerMethodField()
requestor_can_add = serializers.SerializerMethodField()
subdomains = serializers.SerializerMethodField()
evaluation_date = serializers.DateField()
class Meta:
model = Evaluation
fields = [
"url",
"absolute_url",
"id",
"summative",
"employee_locked",
"admin_locked",
"admin_locked_by_id",
"published",
"evidences",
"subdomains",
"requestor_can_add",
"evaluation_type",
"evaluation_level",
"evaluation_date",
"created_by",
"updated_by",
]
在我的设置中,我设置了这样的输入格式:
REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
"DATETIME_FORMAT": "%m/%d/%Y - %I:%M:%S %p",
"DATE_INPUT_FORMATS": ["%Y-%m-%d"],
"DEFAULT_AUTHENTICATION_CLASSES": [
# Enabling this it will require Django Session (Including CSRF)
"rest_framework.authentication.SessionAuthentication"
],
"DEFAULT_PERMISSION_CLASSES": [
# Globally only allow IsAuthenticated users access to API Endpoints
"rest_framework.permissions.IsAuthenticated"
],
}
问题是这样的——当我提交表单时(当输入被隐藏并且 evaluation_date
应该是空白时,它给出了以下错误:
Date has wrong format. Use one of these formats instead: YYYY-MM-DD.
但是这个值应该是空白的(从上面的HTML可以看出)
问题是您要在序列化程序中声明 evaluation_date:
evaluation_date = serializers.DateField()
因此,该字段是必需的。只需从序列化程序中删除它,它就可以工作了。
我正在将表单发布到我的 Django Rest Framework 后端。
我正在使用一个 DateField,它是可选的,具体取决于用户正在查看的表单类型。
当用户可以看到 DateField 和 select 日期时,它会正确提交并且没有问题。
当 DateField 被隐藏时,我在提交表单时收到格式错误(但不应该)
表单通过 HTML 适当地呈现元素:
当日期可见时:
<div class="mt-2 text-center">
<input type="hidden" name="summative" value="127" id="id_summative">
<input type="hidden" name="evaluation_type" value="31" id="id_evaluation_type">
<div id="id_evaluation_levelFormGroup" class="form-group">
<label class="form-label" for="id_evaluation_level">Evaluation level</label>
<select name="evaluation_level" class="form-control" required="" id="id_evaluation_level">
<option value="" selected="">---------</option>
<option value="41">Formal</option>
<option value="42">Informal</option>
</select>
</div>
<div id="id_evaluation_dateFormGroup" class="form-group">
<label class="form-label" for="id_evaluation_date">Evaluation date</label>
<input type="date" name="evaluation_date" value="2021-09-08" class="form-control" id="id_evaluation_date">
</div>
</div>
隐藏时:
<div class="mt-2 text-center">
<input type="hidden" name="summative" value="127" id="id_summative">
<input type="hidden" name="evaluation_type" value="33" id="id_evaluation_type">
<input type="hidden" name="evaluation_level" value="43" id="id_evaluation_level">
<input type="hidden" name="evaluation_date" id="id_evaluation_date">
</div>
evaluation_date
不是必填字段,模型属性如下所示:
evaluation_date = models.DateField(
auto_now=False, auto_now_add=False, null=True, blank=True
)
我的序列化器看起来像这样(包括日期的验证方法):
class EvaluationSerializer(serializers.ModelSerializer):
def validate_evaluation_date(self, attrs):
# Get the date string
date_string = self.context["request"].data["evaluation_date"]
# Get the type
evaluation_type_id = self.context["request"].data["evaluation_type"]
evaluation_type = EvaluationType.objects.get(id=evaluation_type_id)
# If we have an Observation, blanks should not be allowed
if evaluation_type.name == "Observation" and attrs == None:
raise serializers.ValidationError("This field is required.")
if evaluation_type.name == "Observation" and attrs == "":
raise serializers.ValidationError("This field is required.")
# Parse the string into a date object
date = datetime.strptime(date_string, "%Y-%m-%d").date()
return date
absolute_url = serializers.SerializerMethodField()
created_by = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
updated_by = serializers.HiddenField(
default=serializers.CurrentUserDefault()
)
evidences = serializers.SerializerMethodField()
requestor_can_add = serializers.SerializerMethodField()
subdomains = serializers.SerializerMethodField()
evaluation_date = serializers.DateField()
class Meta:
model = Evaluation
fields = [
"url",
"absolute_url",
"id",
"summative",
"employee_locked",
"admin_locked",
"admin_locked_by_id",
"published",
"evidences",
"subdomains",
"requestor_can_add",
"evaluation_type",
"evaluation_level",
"evaluation_date",
"created_by",
"updated_by",
]
在我的设置中,我设置了这样的输入格式:
REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
"DATETIME_FORMAT": "%m/%d/%Y - %I:%M:%S %p",
"DATE_INPUT_FORMATS": ["%Y-%m-%d"],
"DEFAULT_AUTHENTICATION_CLASSES": [
# Enabling this it will require Django Session (Including CSRF)
"rest_framework.authentication.SessionAuthentication"
],
"DEFAULT_PERMISSION_CLASSES": [
# Globally only allow IsAuthenticated users access to API Endpoints
"rest_framework.permissions.IsAuthenticated"
],
}
问题是这样的——当我提交表单时(当输入被隐藏并且 evaluation_date
应该是空白时,它给出了以下错误:
Date has wrong format. Use one of these formats instead: YYYY-MM-DD.
但是这个值应该是空白的(从上面的HTML可以看出)
问题是您要在序列化程序中声明 evaluation_date:
evaluation_date = serializers.DateField()
因此,该字段是必需的。只需从序列化程序中删除它,它就可以工作了。