Diambil dari jawaban saya ke:
Cara menandai kolom formulir dengan <div class = 'field_type'> di Django
class MyForm(forms.Form):
myfield = forms.CharField(widget=forms.TextInput(attrs={'class' : 'myfieldclass'}))
atau
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
self.fields['myfield'].widget.attrs.update({'class' : 'myfieldclass'})
atau
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
widgets = {
'myfield': forms.TextInput(attrs={'class': 'myfieldclass'}),
}
--- EDIT ---
Di atas adalah perubahan termudah untuk membuat kode pertanyaan asli yang memenuhi apa yang ditanyakan. Ini juga mencegah Anda mengulangi diri sendiri jika menggunakan kembali formulir di tempat lain; kelas Anda atau atribut lainnya hanya berfungsi jika Anda menggunakan metode formulir as_table / as_ul / as_p Django. Jika Anda memerlukan kontrol penuh untuk rendering khusus, ini didokumentasikan dengan jelas
- EDIT 2 ---
Menambahkan cara yang lebih baru untuk menentukan widget dan attrs untuk ModelForm.
id
. Kedua biasanya responsobilty sisi template untuk melakukan hal ini, terutama jika Anda akan mengakses kelas ini melalui metode frontend (js, css). Saya tidak mengatakan jawaban Anda salah. Menurut pendapat saya itu hanya praktik yang buruk (terutama ketika Anda bekerja dalam tim dengan pengembang frontend dan backend).Ini dapat dilakukan dengan menggunakan filter templat kustom. Pertimbangkan untuk menyerahkan formulir Anda dengan cara ini:
form.subject
adalah contohBoundField
yang memilikias_widget()
metode.Anda dapat membuat filter khusus
addclass
di my_app / templatetags / myfilters.py :Lalu terapkan filter Anda:
form.subjects
kemudian akan diberikan denganMyClass
kelas CSS.sumber
{{ form.subject|addclass:'myclass1 myclass2' }}
Jika Anda tidak ingin menambahkan kode apa pun ke formulir (seperti yang disebutkan dalam komentar di Jawaban @ shadfc), tentu saja mungkin, berikut adalah dua opsi.
Pertama, Anda hanya mereferensikan bidang secara individual dalam HTML, alih-alih seluruh formulir sekaligus:
(Perhatikan bahwa saya juga mengubahnya ke daftar yang tidak disortir .)
Kedua, perhatikan dalam dokumen tentang menghasilkan formulir sebagai HTML , Django:
Semua bidang formulir Anda sudah memiliki id unik . Jadi Anda akan mereferensikan id_subject dalam file CSS Anda untuk menata bidang subjek . Saya harus perhatikan, ini adalah bagaimana berperilaku formulir ketika Anda mengambil HTML default , yang hanya membutuhkan mencetak formulir, bukan bidang individual:
Lihat tautan sebelumnya untuk opsi lain saat mengeluarkan formulir (Anda bisa membuat tabel, dll).
Catatan - Saya menyadari ini tidak sama dengan menambahkan kelas ke setiap elemen (jika Anda menambahkan bidang ke Formulir, Anda juga perlu memperbarui CSS) - tetapi cukup mudah untuk merujuk semua bidang dengan id di CSS Anda seperti ini:
sumber
Per posting blog ini , Anda dapat menambahkan kelas css ke bidang Anda menggunakan filter templat kustom.
sumber
Anda bisa melakukan ini:
Semoga itu berhasil.
Ignas
sumber
Anda dapat menggunakan perpustakaan ini: https://pypi.python.org/pypi/django-widget-tweaks
Ini memungkinkan Anda untuk melakukan hal berikut:
sumber
render_field
.Anda dapat melakukan:
Kemudian Anda dapat menambahkan kelas / id misalnya
<td>
tag. Tentu saja Anda dapat menggunakan tag orang lain yang Anda inginkan. Periksa Bekerja dengan formulir Django sebagai contoh apa yang tersedia untuk masing-masingfield
dalam formulir ({{field}}
misalnya hanya mengeluarkan tag input, bukan label dan sebagainya).sumber
Salah satu solusinya adalah menggunakan JavaScript untuk menambahkan kelas CSS yang diperlukan setelah halaman siap. Sebagai contoh, styling django form output dengan kelas bootstrap (jQuery digunakan untuk singkatnya):
Ini menghindari keburukan dari mencampur spesifik gaya dengan logika bisnis Anda.
sumber
Tulis formulir Anda seperti:
Di bidang HTML Anda, lakukan sesuatu seperti:
Kemudian di CSS Anda tulis sesuatu seperti:
Semoga jawaban ini patut dicoba! Catatan Anda harus menulis pandangan Anda untuk membuat file HTML yang berisi formulir.
sumber
Anda mungkin tidak perlu mengganti kelas formulir Anda
__init__
, karena Django menetapkanname
&id
atribut dalam HTMLinput
. Anda dapat memiliki CSS seperti ini:sumber
id
bidang yang dibuat oleh Django untuk formets menjadi sangat berbulu ...Tidak melihat yang ini benar-benar ...
https://docs.djangoproject.com/en/1.8/ref/forms/api/#more-granular-output
Output lebih granular
Metode as_p (), as_ul () dan as_table () hanyalah pintasan untuk pengembang yang malas - mereka bukan satu-satunya cara objek formulir dapat ditampilkan.
class BoundField Digunakan untuk menampilkan HTML atau mengakses atribut untuk bidang tunggal dari instance Form.
Metode str () ( unicode on Python 2) dari objek ini menampilkan HTML untuk bidang ini.
Untuk mengambil BoundField tunggal, gunakan sintaks pencarian kamus pada formulir Anda menggunakan nama bidang sebagai kunci:
Untuk mengambil semua objek BoundField, ulangi formulir:
Output khusus bidang menghormati pengaturan auto_id objek bentuk:
sumber
Ada sangat mudah untuk menginstal dan alat yang hebat yang dibuat untuk Django yang saya gunakan untuk styling dan dapat digunakan untuk setiap kerangka frontend seperti Bootstrap, Materialize, Foundation, dll. Ini disebut widget-tweaks Dokumentasi: Widget Tweaks
dari formulir impor Django
Alih-alih menggunakan default:
Anda dapat mengeditnya dengan cara Anda sendiri menggunakan atribut render_field yang memberi Anda cara styling yang lebih mirip html seperti contoh ini:
template.html
Perpustakaan ini memberi Anda kesempatan untuk memisahkan ujung depan Anda dengan backend Anda
sumber
Dalam Django 1.10 (mungkin lebih awal juga) Anda dapat melakukannya sebagai berikut.
Model:
Bentuk:
Templat:
sumber
Sunting: Cara lain (sedikit lebih baik) untuk melakukan apa yang saya sarankan dijawab di sini: Django membentuk style input field
Semua opsi di atas mengagumkan, hanya berpikir saya akan melemparkan yang ini karena berbeda.
Jika Anda ingin gaya kustom, kelas, dll pada formulir Anda, Anda bisa membuat input html di templat Anda yang cocok dengan bidang formulir Anda. Untuk CharField, misalnya, (widget default adalah
TextInput
), katakanlah Anda menginginkan input teks yang tampak seperti bootstrap. Anda akan melakukan sesuatu seperti ini:<input type="text" class="form-control" name="form_field_name_here">
Dan selama Anda memasukkan nama bidang formulir cocok dengan
name
atribusi html , (dan widget mungkin perlu cocok dengan jenis input juga) Django akan menjalankan semua validator yang sama di bidang itu saat Anda menjalankanvalidate
atauform.is_valid()
danMendesain hal-hal lain seperti label, pesan kesalahan, dan teks bantuan tidak memerlukan banyak solusi karena Anda dapat melakukan sesuatu seperti
form.field.error.as_text
dan gaya mereka seperti yang Anda inginkan. Bidang yang sebenarnya adalah bidang yang membutuhkan biola.Saya tidak tahu apakah ini cara terbaik, atau cara saya akan merekomendasikan, tetapi ini adalah cara, dan itu mungkin tepat untuk seseorang.
Berikut adalah langkah-langkah berguna dari bentuk styling dan itu mencakup sebagian besar jawaban yang terdaftar di SO (seperti menggunakan attr pada widget dan tweak widget). https://simpleisbetterthancomplex.com/article/2017/08/19/how-to-render-django-form-manually.html
sumber
Contoh widget styling
Jika Anda ingin membuat satu instance widget terlihat berbeda dari yang lain, Anda harus menentukan atribut tambahan pada saat objek widget dipakai dan ditugaskan ke bidang formulir (dan mungkin menambahkan beberapa aturan ke file CSS Anda).
https://docs.djangoproject.com/en/2.2/ref/forms/widgets/
Untuk melakukan ini, Anda menggunakan argumen Widget.attrs saat membuat widget:
Anda juga dapat memodifikasi widget dalam definisi bentuk:
Atau jika bidang tidak dideklarasikan langsung pada formulir (seperti bidang formulir model), Anda dapat menggunakan atribut Form.fields:
Django kemudian akan menyertakan atribut tambahan dalam output yang diberikan:
sumber