Hubungan Satu-ke-Satu: Menautkan Model Pengguna ke Model Profil Kustom di Django

Terjemahan artikel disiapkan untuk mengantisipasi dimulainya kursus "Pengembang Web dengan Python" .






Pff ... Database lagi?







Ada tiga hubungan utama dalam database relasional:



  • Hubungan satu-ke-satu;
  • Hubungan satu-ke-banyak;
  • Hubungan banyak-ke-banyak.


Pada artikel ini, kita akan membahas yang pertama dari ini, hubungan satu-ke-satu.



Biasanya Django sudah memiliki model pengguna yang datang dengan kerangka kerja. Itu datang dengan bidangnya sendiri, metode, atribut, dll. Kelemahan dari model pengguna ini adalah bahwa ini tidak memperbolehkan Anda untuk menambahkan bidang kustom selain dari default yang sudah disediakan di Django. Ini bisa menjadi masalah serius karena pengembang mungkin perlu mengonfigurasi profil pengguna / klien sepenuhnya dari sekelompok pengguna yang diautentikasi. Misalnya, situs blog mungkin memerlukan profil penulis, yang akan menyertakan foto pengguna, alamat kontak, hobi, ceruk, dll. Dan model pengguna yang datang dengan Django tidak mengizinkan untuk ini.



Untuk mengatasi masalah ini, para pengembang membuat model profil kustom dan menghubungkannya ke model pengguna default di Django menggunakan hubungan satu-ke-satu. Kebetulan pengguna dijamin terhubung ke satu profil dan sebaliknya. Selain itu, mekanik ini memungkinkan kontrol yang lebih baik atas penyesuaian model profil.



Sekarang saya akan menunjukkan kepada Anda bagaimana Anda dapat melakukan ini di Django.



1. Gunakan model pengguna Django default

Dalam aplikasi di mana Anda ingin membuat profil, buat file forms.py baru . Di forms.py, impor modul berikut:



from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User


Buat kelas untuk mewarisi UserCreationForm. Di dalam kelas ini, buat kelas meta lain yang akan memiliki dua variabel: modeldan fields. Variabel modelakan menampung model pengguna Anda, dan variabel akan menampung fieldsbidang formulir yang akan dibuat.



class createUserForm(UserCreationForm):
    class meta:
        model = User
        fields = ['username', 'password1', 'password2']


Kode di atas akan membuat form dengan field untuk username, password, dan konfirmasi password.



2. Buat model profil pengguna kustom Anda.



Dalam file models.py Anda , impor model pengguna default.



from django.contrib.auth.models import User


Selanjutnya, Anda perlu membuat model profil Anda sendiri, dan juga membuat bidang pengguna dengan hubungan satu-ke-satu dengan model pengguna default di Django.



class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True,)
    name = models.CharField(max_length=200, null=True)
    email = models.CharField(max_length=200, null=True)
    address = models.CharField(max_length=200, null=True)

    def __str__(self):
        return self.name


3. Buat bentuk untuk model profil Anda.



Buka file form.py dan impor model profil Anda dari models.py , juga tambahkan beberapa impor lain yang akan berguna saat membuat formulir profil Anda.



from django import forms
from django.utils.translation import ugettext_lazy as _
from .models import Profile


Kemudian buat kelas yang akan mewarisi forms.ModelForm. Di kelas ini, buat kelas meta lain yang berisi dua variabel: modeldan fields. Variabel modelberisi model profil, dan fieldskolom formulir yang akan dibuat.



class profileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['name', 'email', 'address']
#The labels attribute is optional. It is used to define the labels of the form fields created   
        labels = {
                "name": _("Name     "),
                "email": _("Email Address"),
                "address": _("Street Address"),
                }


Sekarang formulir sudah siap, kita akan mendefinisikan logika di views.py sebelum merendernya ke template kita.



4. Tambahkan logika ke views.py .



Untuk bekerja dengan formulir yang dibuat di forms.py, Anda perlu mengimpornya ke views.py kami , dan menambahkan beberapa modul lagi yang akan berguna untuk membuat logika.



from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login,
from django.contrib import messages
from .models import Profile
from .forms import createUserForm, profileForm


Sekarang mari buat halaman registrasi. Sebut saja registerPage . Mari buat kamus konteks kosong dan kembalikan rendernya.



def registerPage(request):    
    context = {}
    return render(request, 'app_name/register.html', context)


Mari tetapkan nilai dari formulir ke variabel dengan memanggil metode POST. Kemudian kami akan meneruskan variabel ke kamus konteks.



def registerPage(request):
    if request.method == 'POST':
        form = createUserForm(request.POST)
        profile_form = profileForm(request.POST)

    context = {'form': form, 'profile_form': profile_form}
    return render(request, 'app_name/register.html', context)


Kemudian kami akan memvalidasi kedua formulir dan menyimpannya setelahnya.



def registerPage(request):
    if request.method == 'POST':
        form = createUserForm(request.POST)
        profile_form = profileForm(request.POST)

        if form.is_valid() and profile_form.is_valid():
            user = form.save()

            #we don't save the profile_form here because we have to first get the value of profile_form, assign the user to the OneToOneField created in models before we now save the profile_form. 

            profile = profile_form.save(commit=False)
            profile.user = user

            profile.save()

    context = {'form': form, 'profile_form': profile_form}
    return render(request, 'app_name/register.html', context)


Jika nilai formulir divalidasi dan disimpan, kami akan menampilkan pesan sukses dan mengarahkan pengguna ke halaman login.



def registerPage(request):
    if request.method == 'POST':
        form = createUserForm(request.POST)
        profile_form = profileForm(request.POST)

        if form.is_valid() and profile_form.is_valid():
            user = form.save()

            #we don't save the profile_form here because we have to first get the value of profile_form, assign the user to the OneToOneField created in models before we now save the profile_form. 

            profile = profile_form.save(commit=False)
            profile.user = user

            profile.save()

            messages.success(request,  'Your account has been successfully created')

            return redirect('login')

    context = {'form': form, 'profile_form': profile_form}
    return render(request, 'app_name/register.html', context)


5. Render template



Dalam file tersebut, register.htmlbuat tag formulir menggunakan metode POST dan actiondengan nilai string kosong. Di tag formulir csrf_token, kami akan menempatkannya dalam format template django, dan kemudian kami akan secara dinamis membuat formulir (formulir pengguna dan profil). Juga, jangan lupa tentang tombol kirim.



<form method="POST" action="">
                {% csrf_token %}
                    <h3>Register Profile</h3>

                    <div class="form-field">
                        {{profile_form.name.label_tag}}
                        {{profile_form.name}}
                    </div>
                    <div class="form-field">
                        {{form.username.errors}}
                        {{form.username.label_tag}}
                        {{form.username}}
                    </div>
                    <div class="form-field">
                        {{profile_form.email.label_tag}}
                        {{profile_form.email}}
                    </div>
                    <div class="form-field">
                        {{profile_form.address.label_tag}}
                        {{profile_form.address}}
                    </div>
                    <div class="form-field">
                        {{form.password1.errors}}
                        {{form.password1.label_tag}}
                        {{form.password1}}
                    </div>
                    <div class="form-field">
                        {{form.password2.errors}}
                        {{form.password2.label_tag}}
                        {{form.password2}}
                    </div>

                <hr>
                <input id="form-button" class="btn btn-success btn-block" type="submit" value="Create Profile">
                <br>
                    {{form.non_field_errors}}
                <p>Already have an account? <a href="{% url 'login' %}">Login</a></p>
            </form>


Karena setelah mengisi formulir, memvalidasi dan menyimpannya, kita dialihkan ke halaman login, pesan tentang keberhasilan operasi akan ditampilkan di halaman login di kanan bawah sebelum tulisan โ€œBelum punya akun? Daftar " .



 <form method="POST" action="">
                   ...
                 <hr>
                <input id="form-button" class="btn btn-success btn-block" type="submit" value="Login">
                
                {% for message in messages %}
                <p>{{message}}</p>
                {% endfor %}
                <p>Don't have an account? <a href="{% url 'store:register' %}">Register</a></p>
            </form>


Ini adalah cara Anda membuat model profil untuk situs Anda yang ditautkan ke model pengguna Anda dalam hubungan satu-ke-satu.








All Articles