DRF DateField - ошибка при сохранении формы: Дата имеет неправильный формат. Вместо этого используйте один из этих форматов: ГГГГ-ММ-ДД
Я отправляю форму на бэкенд Django Rest Framework.
Я использую поле DateField, которое является необязательным в зависимости от типа формы, на которую смотрит пользователь.
Когда пользователь может видеть поле DateField и выбрать дату, он отправляет сообщение должным образом и никаких проблем не возникает.
Когда поле 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()
Поэтому поле является обязательным. Просто удалите его из сериализатора, и оно должно работать.