Saya memiliki formulir pendaftaran yang menghasilkan tampilan. Sekarang saya perlu menambahkan beberapa bidang dari model lain. Bagaimana saya harus mengubah tampilan untuk menambahkan bidang dari model lain?

Ini kode tampilan saya:

def register(request):
    """ User registration """
    if auth.get_user(request).username:
        return redirect('/')

    context = {}
    context.update(csrf(request))
    context['form'] = UserCreationForm()
    if request.POST:
        newuser_form = UserCreationForm(request.POST)
        if newuser_form.is_valid():
            newuser_form.save()
            newuser = auth.authenticate(username=newuser_form.cleaned_data['username'],
                                    password=newuser_form.cleaned_data['password2'])
        auth.login(request, newuser)
        return redirect('/')
        else:
            context['form'] = newuser_form

    return render(request, 'user_auth/user_auth_register.html', context)
2
Roman Kozinets 16 Agustus 2017, 10:58

2 jawaban

Jawaban Terbaik

Sesuatu seperti ini akan membantu Anda:

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

class UserCreateForm(UserCreationForm):
    extra_field = forms.CharField(required=True)

    class Meta:
        model = User
        fields = ("username", "extra_field", "password1", "password2")

    def save(self, commit=True):
        user = super(UserCreateForm, self).save(commit=False)
        user.extra_field = self.cleaned_data["extra_field"]
        if commit:
            user.save()
        return user

Pada dasarnya, memperluas UserCreationForm dan menambahkan bidang tambahan. Juga, simpan dalam metode save().

Semoga membantu.

5
Jahongir Rahmonov 16 Agustus 2017, 08:07

Secara default, UserCreationForm dilengkapi dengan nama pengguna, kata sandi, nama_depan, nama_belakang, email.

Saya ingin menambahkan bidang informasi tambahan (mudah dilakukan setelah fakta menggunakan ProfileUpdateForm) tetapi saya ingin memasukkannya ke dalam formulir pendaftaran awal sehingga pengguna hanya perlu mengirimkan satu kali.

Solusinya adalah dengan menggunakan dua bentuk dan menggabungkannya. Trik sulapnya adalah memulai penyegaran basis data manual untuk mengakses profil yang baru dibuat

Referensi: https://simpleisbetterthancomplex. com/tutorial/2016/07/22/how-to-extend-django-user-model.html

views.py

def register(request):
if request.method == 'POST':
    form = UserRegisterForm(request.POST)
    p_reg_form = ProfileRegisterForm(request.POST)
    if form.is_valid() and p_reg_form.is_valid():
        user = form.save()
        user.refresh_from_db()  # load the profile instance created by the signal
        p_reg_form = ProfileRegisterForm(request.POST, instance=user.profile)
        p_reg_form.full_clean()
        p_reg_form.save()
        messages.success(request, f'Your account has been sent for approval!')
        return redirect('login')
else:
    form = UserRegisterForm()
    p_reg_form = ProfileRegisterForm()
context = {
    'form': form,
    'p_reg_form': p_reg_form
}
return render(request, 'users/register.html', context)

forms.py

class UserRegisterForm(UserCreationForm):
email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']

class ProfileRegisterForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['city', 'state', 'country', 'referral']

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.jpg', upload_to='profile_pics')
    confirmed = models.BooleanField("Confirmed", default=False)

    city = models.CharField("City", max_length=50, blank=True)
    state = models.CharField("State", max_length=50, blank=True)
    country = models.CharField("Country", max_length=50, blank=True)
    referral = models.CharField("Referral", max_length=50, blank=True)

def __str__(self):
    return f'{self.user.username} Profile'

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)
4
mascai 2 Juli 2020, 23:38