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

Поэтому поле является обязательным. Просто удалите его из сериализатора, и оно должно работать.

Вернуться на верх