Как я могу использовать отличные виджеты даты и времени JavaScript, которые администратор по умолчанию использует с моим настраиваемым представлением?
Я просмотрел документацию по формам Django , и в ней кратко упоминается django.contrib.admin.widgets, но я не знаю, как ее использовать?
Вот мой шаблон, к которому я хочу применить его.
<form action="." method="POST">
<table>
{% for f in form %}
<tr> <td> {{ f.name }}</td> <td>{{ f }}</td> </tr>
{% endfor %}
</table>
<input type="submit" name="submit" value="Add Product">
</form>
Кроме того, я думаю, что следует отметить, что я на самом деле не написал сам вид для этой формы, я использую общий вид. Вот запись из url.py:
(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),
И я новичок во всем, что касается Django / MVC / MTV, поэтому, пожалуйста, будьте спокойны ...
Ответы:
Растущая сложность этого ответа с течением времени и множество необходимых взломов, вероятно, должны предостеречь вас от этого вообще. Он полагается на недокументированные внутренние детали реализации администратора, и, скорее всего, снова сломается в будущих версиях Django, и его легче реализовать, чем просто найти другой виджет календаря JS и использовать его.
Тем не менее, вот что вы должны сделать, если вы полны решимости сделать эту работу:
Определите свой собственный подкласс ModelForm для вашей модели (лучше всего поместить его в forms.py в вашем приложении) и попросите его использовать AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (замените «mydate» и т. Д. Соответствующими именами полей из вашей модели):
Измените ваш URLconf так, чтобы он передавал «form_class»: ProductForm вместо «model»: Product в универсальное представление create_object (это будет означать «из my_app.forms import ProductForm» вместо «из my_app.models import Product», конечно).
В заголовке вашего шаблона включите {{form.media}} для вывода ссылок на файлы Javascript.
И хакерская часть: административные виджеты даты / времени предполагают, что загружен материал i18n JS, а также требуют core.js, но не предоставляют ни один из них автоматически. Так что в вашем шаблоне выше {{form.media}} вам понадобится:
Вы также можете использовать следующий админ CSS (спасибо Алексу за упоминание этого):
Это означает, что административный носитель Django (ADMIN_MEDIA_PREFIX) находится в / media / admin / - вы можете изменить это для своей настройки. В идеале вы должны использовать контекстный процессор для передачи этих значений в шаблон вместо жесткого кодирования, но это выходит за рамки этого вопроса.
Для этого также необходимо, чтобы URL / my_admin / jsi18n / был подключен вручную к представлению django.views.i18n.javascript_catalog (или null_javascript_catalog, если вы не используете I18N). Вы должны сделать это самостоятельно, а не просматривать приложение администратора, чтобы оно было доступно независимо от того, вошли ли вы в администратор (спасибо Джереми за то, что указал на это). Пример кода для вашего URLconf:
Наконец, если вы используете Django 1.2 или более позднюю версию, вам понадобится дополнительный код в шаблоне, чтобы помочь виджетам найти свое медиа:
Спасибо lupefiasco за это дополнение.
источник
Поскольку решение является хакерским, я думаю, что использование собственного виджета даты / времени с некоторым JavaScript более целесообразно.
источник
Да, в итоге я переопределил / admin / jsi18n / url.
Вот что я добавил в своем urls.py. Убедитесь, что он выше / admin / url
А вот и созданная мной функция i18n_javascript.
источник
Я часто ссылаюсь на этот пост и обнаружил, что документация определяет немного менее хакерский способ переопределения виджетов по умолчанию.
( Нет необходимости переопределять метод __init__ в ModelForm )
Тем не менее, вам все равно нужно правильно подключить JS и CSS, как упоминает Карл.
forms.py
Типы справочных полей, чтобы найти поля формы по умолчанию.
источник
Мой код головы для версии 1.4 (некоторые новые, а некоторые удалены)
источник
Начиная с Django 1.2 RC1, если вы используете трюк с виджетом для выбора даты администратора Django, в шаблон необходимо добавить следующее, или вы увидите ссылку на значок календаря, на которую ссылается префикс "/ missing-admin-media-prefix /».
источник
В дополнение к ответу Карла Мейера, я хотел бы прокомментировать, что вам нужно поместить этот заголовок в некоторый допустимый блок (внутри заголовка) в вашем шаблоне.
источник
Для Джанго> = 2.0
Шаг 1: Добавьте
javascript-catalog
URL в файл вашего проекта (не приложения)urls.py
.Шаг 2: Добавьте необходимые ресурсы JavaScript / CSS в ваш шаблон.
Шаг 3: Используйте виджеты администратора для полей ввода даты и времени в вашем
forms.py
.источник
Ниже также будет работать в крайнем случае, если вышеперечисленное не удалось
Такой же как
поместите это в вашем forms.py
from django.forms.extras.widgets import SelectDateWidget
источник
Как насчет того, чтобы просто присвоить класс вашему виджету и затем связать этот класс с датщиком JQuery?
Джанго forms.py:
И немного JavaScript для шаблона:
источник
Обновленное решение и обходной путь для SplitDateTime с обязательным = False :
forms.py
form.html
urls.py
источник
Я использую это, это здорово, но у меня есть 2 проблемы с шаблоном:
И для TimeField у меня есть « Введите действительную дату. '
models.py
forms.py
источник
В Django 10. myproject / urls.py: в начале urlpatterns
В моем template.html:
источник
Настройка моего Django: 1.11 Bootstrap: 3.3.7
Так как ни один из ответов не является полностью ясным, я делюсь своим кодом шаблона, который не представляет никаких ошибок вообще.
Верхняя половина шаблона:
Нижняя половина:
источник
3 июня 2020 г. (Все ответы не сработали, вы можете попробовать это решение, которое я использовал. Только для TimeField)
Используйте простые
Charfield
поля времени ( начало и конец в этом примере) в формах.forms.py
мы можем использовать
Form
илиModelForm
здесь.Преобразуйте строковый ввод во временной объект в представлениях.
источник