Bagaimana saya bisa menggunakan widget tanggal dan waktu JavaScript yang bagus yang digunakan admin default dengan tampilan kustom saya?
Saya telah membaca dokumentasi formulir Django , dan secara singkat menyebutkan django.contrib.admin.widgets, tetapi saya tidak tahu bagaimana menggunakannya?
Inilah templat yang saya inginkan.
<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>
Juga, saya pikir perlu dicatat bahwa saya belum benar-benar menulis tampilan sendiri untuk formulir ini, saya menggunakan tampilan generik. Ini adalah entri dari url.py:
(r'^admin/products/add/$', create_object, {'model': Product, 'post_save_redirect': ''}),
Dan saya relevan untuk semua hal Django / MVC / MTV, jadi silakan pergi ...
Jawaban:
Semakin kompleksnya jawaban ini dari waktu ke waktu, dan banyak peretasan diperlukan, mungkin harus mengingatkan Anda untuk tidak melakukan ini sama sekali. Ini bergantung pada detail implementasi internal admin yang tidak berdokumen, kemungkinan akan pecah lagi di versi Django yang akan datang, dan tidak lebih mudah diimplementasikan daripada hanya menemukan widget kalender JS lain dan menggunakannya.
Yang mengatakan, inilah yang harus Anda lakukan jika Anda bertekad untuk membuat ini berfungsi:
Tentukan subclass ModelForm Anda sendiri untuk model Anda (terbaik untuk meletakkannya di forms.py di aplikasi Anda), dan katakan untuk menggunakan AdminDateWidget / AdminTimeWidget / AdminSplitDateTime (ganti 'mydate' dll dengan nama bidang yang tepat dari model Anda):
Ubah URLconf Anda untuk lulus 'form_class': ProductForm, bukan 'model': Produk ke tampilan create_object generik (itu berarti "dari my_app.forms impor ProductForm", bukan "dari my_app.models import Product", tentu saja).
Di bagian atas template Anda, sertakan {{form.media}} untuk menampilkan tautan ke file Javascript.
Dan bagian hacky: widget admin tanggal / waktu menganggap bahwa hal-hal JS i18n telah dimuat, dan juga memerlukan core.js, tetapi tidak menyediakan salah satu secara otomatis. Jadi dalam templat Anda di atas {{form.media}} Anda akan memerlukan:
Anda mungkin juga ingin menggunakan admin CSS berikut (terima kasih Alex karena menyebutkan ini):
Ini menyiratkan bahwa media admin Django (ADMIN_MEDIA_PREFIX) ada di / media / admin / - Anda dapat mengubahnya untuk pengaturan Anda. Idealnya Anda akan menggunakan pengolah konteks untuk meneruskan nilai-nilai ini ke template Anda alih-alih meng-hardcode-nya, tapi itu di luar cakupan pertanyaan ini.
Ini juga mensyaratkan bahwa URL / my_admin / jsi18n / secara manual ditransfer ke tampilan django.views.i18n.javascript_catalog (atau null_javascript_catalog jika Anda tidak menggunakan I18N). Anda harus melakukan ini sendiri alih-alih melalui aplikasi admin sehingga dapat diakses terlepas dari apakah Anda masuk ke admin (terima kasih Jeremy karena menunjukkan ini). Kode contoh untuk URLconf Anda:
Terakhir, jika Anda menggunakan Django 1.2 atau lebih baru, Anda memerlukan beberapa kode tambahan dalam templat Anda untuk membantu widget menemukan medianya:
Terima kasih lupefiasco untuk penambahan ini.
sumber
Karena solusinya adalah meretas, saya pikir menggunakan widget tanggal / waktu Anda sendiri dengan beberapa JavaScript lebih layak.
sumber
Yap, saya akhirnya mengganti / admin / jsi18n / url.
Inilah yang saya tambahkan di urls.py saya. Pastikan itu di atas / admin / url
Dan inilah fungsi i18n_javascript yang saya buat.
sumber
Saya menemukan diri saya banyak merujuk posting ini, dan menemukan bahwa dokumentasi mendefinisikan cara yang sedikit kurang hacky untuk menimpa widget default.
( Tidak perlu mengganti metode __init__ ModelForm )
Namun, Anda masih perlu menghubungkan JS dan CSS Anda dengan tepat seperti yang disebutkan Carl.
forms.py
Jenis Bidang Referensi untuk menemukan bidang formulir default.
sumber
Kode kepala saya untuk versi 1.4 (beberapa baru dan beberapa dihapus)
sumber
Dimulai pada Django 1.2 RC1, jika Anda menggunakan trik widge picker admin Django, yang berikut harus ditambahkan ke templat Anda, atau Anda akan melihat url ikon kalender yang direferensikan melalui "/ missing-admin-media-prefix / ".
sumber
Melengkapi jawaban oleh Carl Meyer, saya ingin berkomentar bahwa Anda perlu meletakkan header itu di beberapa blok yang valid (di dalam header) di dalam template Anda.
sumber
Untuk Django> = 2.0
Langkah 1: Tambahkan
javascript-catalog
URL keurls.py
file proyek Anda (bukan aplikasi) .Langkah 2: Tambahkan sumber daya JavaScript / CSS yang diperlukan ke template Anda.
Langkah 3: Gunakan widget admin untuk bidang input waktu-waktu di Anda
forms.py
.sumber
Di bawah ini juga akan berfungsi sebagai jalan terakhir jika gagal di atas
Sama dengan
letakkan ini di forms.py Anda
from django.forms.extras.widgets import SelectDateWidget
sumber
Bagaimana dengan hanya menetapkan kelas untuk widget Anda dan kemudian mengikat kelas itu ke datepicker JQuery?
Django forms.py:
Dan beberapa JavaScript untuk templat:
sumber
Solusi dan solusi yang diperbarui untuk SplitDateTime dengan wajib = Salah :
forms.py
form.html
urls.py
sumber
Saya menggunakan ini, sangat bagus, tetapi saya memiliki 2 masalah dengan templat:
Dan untuk TimeField saya memiliki ' Masukkan tanggal yang valid. '
models.py
forms.py
sumber
Dalam Django 10. myproject / urls.py: di awal urlpatterns
Di templat.html saya:
sumber
Pengaturan Django Saya: 1.11 Bootstrap: 3.3.7
Karena tidak ada jawaban yang sepenuhnya jelas, saya membagikan kode templat saya yang sama sekali tidak menunjukkan kesalahan.
Setengah dari template:
Setengah bawah:
sumber
3 Juni 2020 (Semua jawaban tidak berhasil, Anda dapat mencoba solusi yang saya gunakan ini. Hanya untuk TimeField)
Gunakan sederhana
Charfield
untuk bidang waktu ( mulai dan akhiri dalam contoh ini) dalam formulir.forms.py
bisa kita gunakan
Form
atau diModelForm
sini.Ubah input string menjadi objek waktu dalam tampilan.
sumber