Saya sedang membangun aplikasi pelacakan tiket dukungan dan memiliki beberapa model yang ingin saya buat dari satu halaman. Tiket menjadi milik Pelanggan melalui ForeignKey. Catatan juga termasuk dalam Tiket melalui ForeignKey. Saya ingin memiliki opsi untuk memilih Pelanggan (itu adalah proyek yang terpisah) ATAU membuat Pelanggan baru, lalu membuat Tiket dan akhirnya membuat Catatan yang ditetapkan ke tiket baru.
Karena saya cukup baru di Django, saya cenderung bekerja secara berulang, mencoba fitur baru setiap kali. Saya telah bermain dengan ModelForms tetapi saya ingin menyembunyikan beberapa bidang dan melakukan beberapa validasi yang kompleks. Sepertinya tingkat kontrol yang saya cari membutuhkan kumpulan formulir atau melakukan semuanya dengan tangan, lengkap dengan halaman templat kode tangan yang membosankan, yang saya coba hindari.
Apakah ada beberapa fitur menarik yang saya lewatkan? Apakah seseorang memiliki referensi atau contoh yang baik untuk menggunakan kumpulan formulir? Saya menghabiskan seluruh akhir pekan di dokumen API untuk mereka dan saya masih tidak mengerti. Apakah ini masalah desain jika saya rusak dan membuat kode manual semuanya?
sumber
Jawaban:
Ini sebenarnya tidak terlalu sulit untuk diterapkan dengan ModelForms . Jadi katakanlah Anda memiliki Formulir A, B, dan C. Anda mencetak setiap formulir dan halaman dan sekarang Anda perlu menangani POST.
Berikut adalah dokumen untuk validasi kustom.
sumber
Saya baru saja mengalami situasi yang sama sehari yang lalu, dan ini 2 sen saya:
1) Saya menemukan demonstrasi terpendek dan paling ringkas dari beberapa entri model dalam bentuk tunggal di sini: http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/ .
Singkatnya: Buat formulir untuk setiap model, kirimkan keduanya ke template dalam satu
<form>
, menggunakanprefix
keyarg dan minta validasi pegangan tampilan. Jika ada ketergantungan, pastikan Anda menyimpan model "induk" sebelum bergantung, dan gunakan ID induk untuk kunci asing sebelum melakukan penyimpanan model "anak". Tautan memiliki demo.2) Mungkin formsets dapat dipukuli dalam melakukan hal ini, tapi sejauh yang saya menggali di, formsets terutama untuk memasuki kelipatan dari model yang sama, yang mungkin secara opsional diikat ke model lain / model dengan kunci asing. Namun, tampaknya tidak ada opsi default untuk memasukkan lebih dari satu data model dan sepertinya bukan itu yang dimaksudkan untuk formset.
sumber
Saya baru-baru ini mengalami masalah dan baru saja menemukan cara untuk melakukan ini. Dengan asumsi Anda memiliki tiga kelas, Primer, B, C dan B, C memiliki kunci asing ke primer
Metode ini memungkinkan Anda melakukan validasi apa pun yang Anda perlukan, serta menghasilkan ketiga objek di halaman yang sama. Saya juga menggunakan javascript dan bidang tersembunyi untuk memungkinkan pembuatan beberapa objek B, C pada halaman yang sama.
sumber
The MultiModelForm dari
django-betterforms
adalah pembungkus nyaman untuk melakukan apa yang dijelaskan dalam jawaban Gnudiff ini . Ini membungkus regulerModelForm
dalam satu kelas yang secara transparan (setidaknya untuk penggunaan dasar) digunakan sebagai satu bentuk. Saya telah menyalin contoh dari dokumen mereka di bawah ini.sumber
django-betterforms
dan kelas MultiModelFormnya sebelum menemukan jawaban Anda. Solusi mereka terlihat sangat bagus tetapi tampaknya belum diperbarui untuk sementara waktu. Apakah Anda masih menggunakan @jozxyqk ini? Masalah apapun?Saat ini saya memiliki fungsionalitas solusi (lulus tes unit saya). Ini adalah solusi yang bagus untuk pendapat saya ketika Anda hanya ingin menambahkan sejumlah bidang dari model lain.
Apakah saya melewatkan sesuatu di sini?
sumber
"Saya ingin menyembunyikan beberapa bidang dan melakukan validasi yang rumit."
Saya mulai dengan antarmuka admin bawaan.
Buat ModelForm untuk menampilkan bidang yang diinginkan.
Perluas Formulir dengan aturan validasi di dalam formulir. Biasanya ini adalah
clean
metode.Pastikan bagian ini berfungsi dengan baik.
Setelah ini selesai, Anda dapat keluar dari antarmuka admin bawaan.
Kemudian Anda dapat bermain-main dengan beberapa formulir yang sebagian terkait pada satu halaman web. Ini adalah sekumpulan barang template untuk menampilkan semua formulir dalam satu halaman.
Kemudian Anda harus menulis fungsi view untuk membaca dan memvalidasi berbagai form dan melakukan berbagai object saves ().
"Apakah ini masalah desain jika saya rusak dan membuat kode manual semuanya?" Tidak, ini hanya waktu yang lama dan tidak banyak manfaatnya.
sumber
Menurut dokumentasi Django, kumpulan formulir sebaris untuk tujuan ini: "Kumpulan formulir sebaris adalah lapisan abstraksi kecil di atas kumpulan formulir model. Ini menyederhanakan kasus bekerja dengan objek terkait melalui kunci asing".
Lihat https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#inline-formsets
sumber