Apa cara terbaik untuk memperluas model Pengguna (dibundel dengan aplikasi otentikasi Django) dengan bidang khusus? Saya juga mungkin ingin menggunakan email sebagai nama pengguna (untuk tujuan otentikasi).
Saya sudah melihat beberapa cara untuk melakukannya, tetapi tidak dapat memutuskan mana yang terbaik.
Jawaban:
Cara paling tidak menyakitkan dan memang direkomendasikan Django untuk melakukan ini adalah melalui
OneToOneField(User)
properti.Yang mengatakan, memperluas
django.contrib.auth.models.User
dan menggantinya juga berfungsi ...Saya pasti akan tinggal jauh dari mengubah kelas Pengguna yang sebenarnya di pohon sumber Django Anda dan / atau menyalin dan mengubah modul auth.
sumber
user = models.ForeignKey(User, unique=True)
apakah ini sama denganuser = models.OneToOneField(User)
? Saya akan berpikir efek akhirnya sama? Tapi mungkin implementasi di backend berbeda.Catatan: jawaban ini sudah usang. lihat jawaban lain jika Anda menggunakan Django 1.7 atau lebih baru.
Beginilah cara saya melakukannya.
Ini akan membuat profil pengguna setiap kali pengguna disimpan jika itu dibuat. Anda kemudian dapat menggunakan
Berikut ini beberapa info lebih lanjut dari dokumen
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Pembaruan: Harap perhatikan bahwa
AUTH_PROFILE_MODULE
sudah usang sejak v1.5: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-modulesumber
user = models.ForeignKey( User )
, dan mengambil objek profil melaluiuser.get_profile()
. Ingat untukfrom django.contrib.admin.models import User
.User
Nah, beberapa waktu berlalu sejak 2008 dan sudah waktunya untuk beberapa jawaban segar. Sejak Django 1.5 Anda akan dapat membuat kelas Pengguna khusus. Sebenarnya, pada saat saya menulis ini, itu sudah digabung menjadi master, jadi Anda bisa mencobanya.
Ada beberapa informasi tentang hal itu dalam dokumen atau jika Anda ingin menggali lebih dalam, dalam komit ini .
Yang harus Anda lakukan adalah menambahkan
AUTH_USER_MODEL
ke pengaturan dengan jalur ke kelas pengguna khusus, yang meluas baikAbstractBaseUser
(versi lebih dapat disesuaikan) atauAbstractUser
(lebih kurang kelas Pengguna lama Anda dapat memperluas).Untuk orang yang malas mengklik, berikut ini contoh kode (diambil dari dokumen ):
sumber
email
adalah nama pengguna.unique=True
ke bidang email untukUSERNAME_FIELD
menerimanyaSejak Django 1.5 Anda dapat dengan mudah memperluas model pengguna dan menyimpan satu tabel pada database.
Anda juga harus mengkonfigurasinya sebagai kelas pengguna saat ini di file pengaturan Anda
Jika Anda ingin menambahkan banyak preferensi pengguna, opsi OneToOneField mungkin pilihan yang lebih baik.
Catatan untuk orang-orang yang mengembangkan perpustakaan pihak ketiga: jika Anda perlu mengakses kelas pengguna ingat bahwa orang-orang dapat mengubahnya. Gunakan pembantu resmi untuk mendapatkan kelas yang tepat
sumber
django_social_auth
, saya sarankan menggunakan hubungan OneToOne. JANGAN gunakan metode ini atau itu akan mengacaukan migrasi Anda.django_social_auth
plugin dan mendefinisikan AUTH_USER_MODEL ke pengguna auth sosial. Lalu, ketika saya menjalankan manage.py, migrasi itu mengacaukan aplikasi saya. Ketika sebaliknya saya menggunakan model pengguna autentikasi sosial sebagai hubungan OneToOne yang dijelaskan di sini: stackoverflow.com/q/10638293/977116Changing this setting after you have tables created is not supported by makemigrations and will result in you having to manually write a set of migrations to fix your schema
Sumber: docs.djangoproject.com/en/dev/topics/auth/customizing/…Ada rekomendasi resmi untuk menyimpan informasi tambahan tentang pengguna . Buku Django juga membahas masalah ini di bagian Profil .
sumber
Yang di bawah ini adalah pendekatan lain untuk memperluas Pengguna. Saya merasa itu lebih jelas, mudah, dapat dibaca kemudian di atas dua pendekatan.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
Menggunakan pendekatan di atas:
sumber
Anda dapat Cukup memperluas profil pengguna dengan membuat entri baru setiap kali ketika pengguna dibuat dengan menggunakan Django posting menyimpan sinyal
models.py
Ini secara otomatis akan membuat contoh karyawan ketika pengguna baru dibuat.
Jika Anda ingin memperluas model pengguna dan ingin menambahkan informasi lebih lanjut saat membuat pengguna, Anda dapat menggunakan django-betterforms ( http://django-betterforms.readthedocs.io/en/latest/multiform.html ). Ini akan membuat formulir tambah pengguna dengan semua bidang yang ditentukan dalam model UserProfile.
models.py
forms.py
views.py
addUser.html
urls.py
sumber
Memperluas Model Pengguna Django (UserProfile) seperti Pro
Saya menemukan ini sangat berguna: tautan
Ekstrak:
dari django.contrib.auth.models impor Pengguna
sumber
Baru di Django 1.5, sekarang Anda dapat membuat Model Pengguna Kustom Anda sendiri (yang tampaknya merupakan hal yang baik untuk dilakukan dalam kasus di atas). Lihat 'Menyesuaikan otentikasi dalam Django'
Mungkin fitur baru paling keren pada rilis 1.5.
sumber
Inilah yang saya lakukan dan menurut saya cara paling sederhana untuk melakukan ini. mendefinisikan manajer objek untuk model kustomisasi baru Anda kemudian mendefinisikan model Anda.
Jangan lupa menambahkan baris kode ini di
settings.py
:Inilah yang saya lakukan dan selalu berhasil.
sumber
Saat ini pada Django 2.2, cara yang disarankan ketika memulai proyek baru adalah membuat model pengguna kustom yang mewarisi dari AbstractUser, kemudian arahkan AUTH_USER_MODEL ke model.
Sumber: https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
sumber
Pendekatan sederhana dan efektif adalah models.py
sumber