Jak mogę używać sprytnych widżetów daty i czasu JavaScript, których używa domyślny administrator w moim niestandardowym widoku?
Przejrzałem dokumentację formularzy Django i krótko wspomina o django.contrib.admin.widgets, ale nie wiem, jak go używać?
Oto mój szablon, na którym chcę go zastosować.
<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>
Myślę też, że należy zauważyć, że tak naprawdę nie napisałem osobiście widoku tego formularza, używam widoku ogólnego. Oto wpis z url.py:
(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),
Jestem całkiem nowy w całej sprawie Django / MVC / MTV, więc proszę, bądź spokojny ...
Odpowiedzi:
Rosnąca złożoność tej odpowiedzi z biegiem czasu i wiele wymaganych hacków prawdopodobnie powinno Cię przestrzec przed zrobieniem tego w ogóle. Opiera się na nieudokumentowanych wewnętrznych szczegółach implementacji administratora, prawdopodobnie ponownie się zepsuje w przyszłych wersjach Django i nie jest łatwiejszy do wdrożenia niż po prostu znalezienie innego widżetu kalendarza JS i użycie go.
To powiedziawszy, oto co musisz zrobić, jeśli jesteś zdeterminowany, aby to zadziałało:
Zdefiniuj własną podklasę ModelForm dla swojego modelu (najlepiej umieścić ją w forms.py w swojej aplikacji) i powiedz mu, aby używał AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (zastąp „mydate” itp. Odpowiednimi nazwami pól z Twojego modelu):
Zmień adres URLconf, aby przekazywał „form_class”: ProductForm zamiast „model”: Product do ogólnego widoku create_object (co oczywiście będzie oznaczać „from my_app.forms import ProductForm” zamiast „from my_app.models import Product”, oczywiście).
W nagłówku szablonu umieść {{form.media}}, aby wyświetlić linki do plików Javascript.
I zepsuta część: widżety daty / czasu administratora zakładają, że elementy JS i18n zostały załadowane, a także wymagają core.js, ale nie dostarczają żadnego z nich automatycznie. Więc w swoim szablonie powyżej {{form.media}} będziesz potrzebować:
Możesz także chcieć użyć następującego CSS administratora (dzięki Alex za wspomnienie o tym):
Oznacza to, że nośnik administratora Django (ADMIN_MEDIA_PREFIX) znajduje się w / media / admin / - możesz to zmienić dla swojej konfiguracji. Idealnie byłoby użyć procesora kontekstu do przekazania tych wartości do szablonu zamiast zakodowania go na sztywno, ale to wykracza poza zakres tego pytania.
Wymaga to również, aby adres URL / my_admin / jsi18n / był ręcznie połączony z widokiem django.views.i18n.javascript_catalog (lub null_javascript_catalog, jeśli nie używasz I18N). Musisz to zrobić samodzielnie, zamiast przechodzić przez aplikację administratora, aby była dostępna niezależnie od tego, czy jesteś zalogowany jako administrator (dzięki Jeremy za wskazanie tego). Przykładowy kod dla twojego URLconf:
Na koniec, jeśli używasz Django 1.2 lub nowszego, potrzebujesz dodatkowego kodu w swoim szablonie, aby pomóc widżetom znaleźć ich multimedia:
Dzięki lupefiasco za ten dodatek.
źródło
Ponieważ rozwiązanie jest hakerskie, myślę, że użycie własnego widżetu daty / czasu z niektórymi JavaScript jest bardziej wykonalne.
źródło
Tak, w końcu nadpisałem / admin / jsi18n / url.
Oto, co dodałem w moim urls.py. Upewnij się, że znajduje się nad / admin / url
A oto funkcja i18n_javascript, którą stworzyłem.
źródło
Często odwołuję się do tego posta i stwierdziłem, że dokumentacja definiuje nieco mniej hakerski sposób na zastąpienie domyślnych widżetów.
( Nie ma potrzeby nadpisywania metody __init__ ModelForm )
Jednak nadal musisz odpowiednio połączyć JS i CSS, jak wspomina Carl.
forms.py
Odwołaj się do typów pól, aby znaleźć domyślne pola formularza.
źródło
Mój kod głowy dla wersji 1.4 (niektóre nowe i niektóre usunięte)
źródło
Począwszy od Django 1.2 RC1, jeśli używasz sztuczki z widmem wyboru daty administratora Django, do szablonu należy dodać następujące elementy lub zobaczysz, że adres URL ikony kalendarza jest wskazywany przez „/ missing-admin-media-prefix / ”.
źródło
Uzupełniając odpowiedź Carla Meyera, chciałbym skomentować, że musisz umieścić ten nagłówek w jakimś prawidłowym bloku (wewnątrz nagłówka) w swoim szablonie.
źródło
Dla Django> = 2.0
Krok 1: Dodaj
javascript-catalog
adres URL dourls.py
pliku projektu (nie aplikacji) .Krok 2: Dodaj wymagane zasoby JavaScript / CSS do szablonu.
Krok 3: Użyj widżetów administratora do pól wprowadzania daty i godziny w pliku
forms.py
.źródło
Poniższe będzie również działać w ostateczności, jeśli powyższe zawiodło
Taki sam jak
umieść to w swoim forms.py
from django.forms.extras.widgets import SelectDateWidget
źródło
A co powiesz na przypisanie klasy do widżetu, a następnie powiązanie tej klasy z datownikiem JQuery?
Django forms.py:
I trochę JavaScript do szablonu:
źródło
Zaktualizowane rozwiązanie i obejście dla SplitDateTime z required = False :
forms.py
form.html
urls.py
źródło
Używam tego, jest super, ale mam 2 problemy z szablonem:
A dla TimeField mam „ Wprowadź prawidłową datę”. '
models.py
forms.py
źródło
W Django 10. myproject / urls.py: na początku wzorców url
W moim template.html:
źródło
Moja konfiguracja Django: 1.11 Bootstrap: 3.3.7
Ponieważ żadna z odpowiedzi nie jest całkowicie jasna, udostępniam kod szablonu, który nie przedstawia żadnych błędów.
Górna połowa szablonu:
Dolna połowa:
źródło
3 czerwca 2020 r. (Wszystkie odpowiedzi nie zadziałały, możesz wypróbować to rozwiązanie, którego użyłem. Tylko dla TimeField)
Użyj prostych
Charfield
pól czasu ( początek i koniec w tym przykładzie) w formularzach.forms.py
możemy użyć
Form
lubModelForm
tutaj.Konwertuj ciąg wejściowy na obiekt czasu w widokach.
źródło