Что означает ошибка «Введите список значений». имею в виду? (Использование jQuery datetimepicker в форме администратора django) - PullRequest
0 голосов
/ 08 мая 2019

Редактировать : кажется, что когда мы используем DateTimeField в django, он ожидает два ввода, один с датой, а другой со временем, подобным этому:

enter image description here

Так что я просто создам два поля, одно для времени и одно для даты, опубликую ответ, если он будет работать, как ожидалось.


Я создал пользовательский виджет, чтобы заменить на моем административном сайте инструмент выбора даты и времени по умолчанию в django.

Для этого я следовал этим инструкциям но все заканчивается так, когда я нажимаю кнопку сохранения:

enter image description here

У меня нет других конкретных ошибок в журналах.

Для более подробной информации, вот код:

settings.py:

DATE_INPUT_FORMATS = ['%d/%m/%Y %H:%M']

приложение / шаблоны / виджеты / xdsoft_datetimepicker.html

{% include "django/forms/widgets/input.html" %}
<!-- jQuery -->
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>

  <!-- XDSoft DateTimePicker -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.min.css" integrity="sha256-DOS9W6NR+NFe1fUhEE0PGKY/fubbUCnOfTje2JMDw3Y=" crossorigin="anonymous" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js" integrity="sha256-FEqEelWI3WouFOo2VWP/uJfs1y8KJ++FLh2Lbqc8SJk=" crossorigin="anonymous"></script>


<script>
  $(function () {
    $("input[name='{{ widget.name }}']").datetimepicker({
      format: 'd/m/Y H:i',
    });
  });
</script>

Приложение / models.py:

class DatesAndDates(models.Model):
    date_time_1 = models.DateTimeField()

Приложение / forms.py:

class DateForm(forms.ModelForm):
    class Meta:
        model = DatesAndDates
        widgets = {
            "date_time_1": XDSoftDateTimePickerInput(
            )
        }
        fields=["date_time_1"]

И, наконец, app / admin.py:

@admin.register(DatesAndDates)
class DatesAndDatesAdmin(admin.ModelAdmin):
    form = DateForm
    list_display = ["date_time_1"]

Прежде чем пытаться это сделать, я просто использовал Charfield для даты и времени и добавил скрипт jQuery, переопределив шаблон change_form.html, но мне не удалось преобразовать строку datetime в допустимый тип datetime.

Спасибо за чтение и за помощь.

1 Ответ

0 голосов
/ 10 мая 2019

Как я сказал в редактировании: Когда мы используем models.DateTimeField, Dango ожидает данные из двух полей формы, одного для даты и одного для времени. Как я уже сказал, я создал два поля в моей модели, одно models.DateField и одно models.TimeField. И вот метод, который я использовал, чтобы создать свой собственный виджет в моем приложении:

Приложение / widget.py:

from django.forms import DateInput, TimeInput

# Overriding DateInput and TimeInput's template with my own one
class XDSoftDatePickerInput(DateInput):
    template_name = 'widgets/xdsoft_datetimepicker.html'

class XDSoftTimePickerInput(TimeInput):
    template_name = 'widgets/xdsoft_datetimepicker.html'

приложение / шаблоны / виджеты / xdsoft_datetimepicker.html

{% include "django/forms/widgets/input.html" %}
<!-- jQuery -->
  <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>

  <!-- XDSoft DateTimePicker -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.min.css" integrity="sha256-DOS9W6NR+NFe1fUhEE0PGKY/fubbUCnOfTje2JMDw3Y=" crossorigin="anonymous" />
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js" integrity="sha256-FEqEelWI3WouFOo2VWP/uJfs1y8KJ++FLh2Lbqc8SJk=" crossorigin="anonymous"></script>


<script>
  $.datetimepicker.setLocale('fr');

  widget_name = '{{ widget.name }}'
  if (~widget_name.indexOf("date")){
    $(function () {
      $("input[name='{{ widget.name }}']").datetimepicker({
        format: 'd/m/Y',
          timepicker:false,
      });
    });
  }
  else{
    $(function () {
      $("input[name='{{ widget.name }}']").datetimepicker({
        format: 'H:i',
        datepicker:false,
      });
    });
  }
</script>

Приложение / models.py:

class Event(models.Model):
    date_begin = models.DateField(verbose_name="Date début de l'évènement")
    hour_begin = models.TimeField(verbose_name="Heure début de l'évènement")
    date_end = models.DateField(blank=True, null=True, verbose_name="Date de fin de l'évènement")
    hour_end = models.TimeField(blank=True, null=True, verbose_name="Heure de Fin de l'évènement")

Приложение / forms.py:

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        widgets = {
            "date_begin": XDSoftDatePickerInput(
            ),
            "date_end": XDSoftDatePickerInput(
            ),
            "hour_begin": XDSoftTimePickerInput(
            ),
            "hour_end": XDSoftTimePickerInput(
            )
        }
        fields='__all__'

И вуаля:

enter image description here

Но здесь есть проблема: Каждый раз, когда вы будете использовать виджет, скрипт jquery будет включен в вашу страницу ...

...