Anggaplah saya memiliki formulir
class SampleClass(forms.Form):
name = forms.CharField(max_length=30)
age = forms.IntegerField()
django_hacker = forms.BooleanField(required=False)
Apakah ada cara bagi saya untuk mendefinisikan kelas css pada masing-masing bidang sehingga saya dapat menggunakan jQuery berdasarkan kelas di halaman yang diberikan?
Saya berharap tidak harus secara manual membangun formulir.
python
django
django-forms
ashchristopher
sumber
sumber
Jawaban:
Namun solusi lain yang tidak memerlukan perubahan dalam kode python dan karena itu lebih baik untuk desainer dan perubahan presentasi satu kali: django-widget-tweaks . Semoga ada yang berguna.
sumber
Menjawab pertanyaan saya sendiri. Mendesah
http://docs.djangoproject.com/en/dev/ref/forms/widgets/#django.forms.Widget.attrs
Saya tidak menyadari itu dilewatkan ke konstruktor widget.
sumber
Berikut adalah solusi lain untuk menambahkan definisi kelas ke widget setelah mendeklarasikan bidang di kelas.
sumber
Gunakan django-widget-tweak , mudah digunakan dan berfungsi dengan baik.
Kalau tidak, ini bisa dilakukan menggunakan filter templat kustom.
Mengingat Anda membuat formulir Anda dengan cara ini:
form.subject adalah turunan dari BoundField yang memiliki metode as_widget .
Anda dapat membuat filter khusus "addcss" di "my_app / templatetags / myfilters.py"
Lalu terapkan filter Anda:
form.subjects kemudian akan diberikan dengan kelas css "MyClass".
Semoga bantuan ini.
EDIT 1
Perbarui filter sesuai dengan jawaban dimyG
Tambahkan tautan django-widget-tweak
EDIT 2
sumber
get('class', None).split(' ')
akan gagal jika tag tidak memiliki atribut class, sepertiNone
yang dikembalikan. Mengubahnyaget('class', '').split(' ')
berfungsiMemperluas metode yang ditunjukkan pada docs.djangoproject.com:
Saya pikir itu merepotkan karena harus mengetahui jenis widget asli untuk setiap bidang, dan menganggapnya lucu untuk mengesampingkan default hanya dengan meletakkan nama kelas pada bidang formulir. Ini sepertinya bekerja untuk saya:
Ini agak bersih bagi saya.
sumber
Jika Anda ingin semua bidang dalam formulir mewarisi kelas tertentu, Anda cukup mendefinisikan kelas induk, yang mewarisi dari
forms.ModelForm
, dan kemudian mewarisi dari ituIni membantu saya untuk menambahkan
'form-control'
kelas ke semua bidang pada semua bentuk aplikasi saya secara otomatis, tanpa menambahkan replikasi kode.sumber
Berikut adalah cara sederhana untuk mengubah tampilan. tambahkan di bawah ini tepat sebelum meneruskannya ke templat.
sumber
Cukup tambahkan kelas ke formulir Anda sebagai berikut.
sumber
Berikut adalah variasi di atas yang akan memberikan semua bidang kelas yang sama (misalnya sudut bulat bagus jquery).
sumber
Anda bisa coba ini ..
Anda dapat melihat informasi lebih lanjut di: Django Widgets
sumber
Jika Anda ingin menambahkan kelas ke bidang formulir di Templat (bukan di view.py atau form.py) misalnya dalam kasus yang Anda ingin memodifikasi aplikasi pihak ke-3 tanpa mengesampingkan tampilan mereka, maka filter template seperti yang dijelaskan dalam jawaban Charlesthk sangat nyaman. Tetapi dalam jawaban ini filter templat menimpa kelas yang ada yang mungkin dimiliki bidang.
Saya mencoba menambahkan ini sebagai suntingan tetapi disarankan untuk ditulis sebagai jawaban baru.
Jadi, inilah tag templat yang menghormati kelas bidang yang ada:
sumber
Ternyata Anda bisa melakukan ini dalam bentuk konstruktor ( fungsi init ) atau setelah kelas bentuk dimulai. Ini kadang-kadang diperlukan jika Anda tidak menulis formulir Anda sendiri dan formulir itu datang dari tempat lain -
sumber
Anda juga bisa menggunakan Django Crispy Forms , ini adalah alat yang hebat untuk mendefinisikan formulir jika Anda ingin menggunakan beberapa kerangka kerja CSS seperti Bootstrap atau Foundation. Dan mudah untuk menentukan kelas untuk bidang formulir Anda di sana.
Kelas formulir Anda akan menyukai ini:
sumber