Ошибка проверки даты и времени с использованием datetime-local - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь отобразить базовый шаблон c HTML, который позволил бы мне вводить значения даты и времени в базу данных с использованием типа ввода datetime-local. Однако каждый раз, когда я пытаюсь ввести значение, оно всегда возвращает ошибку Enter a valid date/time

models.py

class AirframeOperation(models.Model):
    id = models.AutoField(primary_key=True)
    takeoff = models.DateTimeField()
    landing = models.DateTimeField()
    flight_time = models.DurationField()
    metadata = models.OneToOneField(
        Metadata,
        on_delete=models.CASCADE
    )

    def save(self, *args, **kwargs):

        self.block_time = self.block_on - self.block_off
        self.flight_time = self.landing - self.takeoff
        return super(AirframeOperation, self).save(*args, **kwargs)

forms.py

class InsertAirframeOperation(forms.ModelForm):

    takeoff = forms.DateTimeField(
        input_formats=['%d-%m-%YT%H:%M'],
        widget=forms.DateTimeInput(
            attrs={
                'type': 'datetime-local',
                'class': 'form-control'
            },
            format='%d-%m-%YT%H:%M')
    )

    landing = forms.DateTimeField(
        input_formats=['%d-%m-%YT%H:%M'],
        widget=forms.DateTimeInput(
            attrs={
                'type': 'datetime-local',
                'class': 'form-control'
            },
            format='%d-%m-%YT%H:%M')
    )

    class Meta:
        model = AirframeOperation
        fields = ['takeoff', 'landing']
        widgets = {}

views.py

@login_required(login_url='/accounts/login/')
def dataentry(request):                                   
    if request.method == 'POST':
        form_meta = forms.InsertMetadata(request.POST)
        form_airframe = forms.InsertAirframeOperation(request.POST)
        print(form_airframe.errors)
        metadata = None
        if form_meta.is_valid():
            metadata = form_meta.save(commit=False)
            metadata.save()
            meta_id = metadata.id
            print(meta_id)
            metadata = Metadata.objects.get(id=meta_id)
        if form_airframe.is_valid():
            airframe = form_airframe.save(commit=False)
            airframe.metadata = metadata
            airframe.save()
        return redirect('/')
    else:
        form_meta = forms.InsertMetadata()
        form_airframe = forms.InsertAirframeOperation()
        return render(request, "dashboard/data_entry.html", {'form': form_meta, 'form2': form_airframe})

data_entry. html

{% extends "base.html" %}

{% block content %}
<div id="data_entry_container">
    <h3>Metadata General</h3>
    <form method="post" action="" enctype="multipart/form-data">
        {% csrf_token %}

        <p>{{ form.errors }}</p>
        <p>{{ form.non_field_errors }}</p>
        {{ form.as_p }}

        <h3>Airframe Operation Metadata</h3>
        <p>{{ form2.errors }}</p>
        <p>{{ form2.non_field_errors }}</p>
        {{ form2.as_p }}

         <input type="submit" value="Save">
    </form>

</div>

{% endblock content %}

Я пробовал искать в документации, а также пробовать решения, перечисленные здесь , но это все еще не не проверяет правильно

1 Ответ

0 голосов
/ 08 мая 2020

Вместо того, чтобы объявлять "input_formats" в самом поле, попробуйте объявить его при инициализации.

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields["takeoff"].input_formats = ["%Y-%m-%dT%H:%M"]

Я ломаю голову над этой же проблемой около часа, и, похоже, ничего не работает, кроме этой.

Следует отметить, что, как указано в документации (https://docs.djangoproject.com/en/3.0/ref/forms/fields/), DateTimeField должен принимать необязательный аргумент input_formats. Но почему это не работает, я понятия не имею.

Если кто-то может объяснить эту проблему лучше, чем я, сделайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...