اضافه کردن فیلد ایمیل به فرم ثبت نام

سلام

به صورت پیش فرض فیلد ایمیل در UserCreationForm وجود ندارد اما به راحتی آن را می‌توان به فرم اضافه کرد.

فایلی به نام forms.py را در فولدر accounts  ایجاد کنیم.

accounts/forms.py

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

class SignUpForm(UserCreationForm):
    email = forms.CharField(max_length=254, required=True, widget=forms.EmailInput())
    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

خیلی خوب! حالا به جای استفاده از UserCreationForm در فایل views.py، از فرم جدید خود با نام SignUpForm استفاده می کنیم.

accounts/views.py

from django.contrib.auth import login as auth_login
from django.shortcuts import render, redirect

from .forms import SignUpForm

def signup(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            user = form.save()
            auth_login(request, user)
            return redirect('home')
    else:
        form = SignUpForm()
    return render(request, 'signup.html', {'form': form})

و خروجی به شکل زیر خواهد شد.

فایل تست را هم به روز می کنیم.

from .forms import SignUpForm

class SignUpTests(TestCase):
    # ...

    def test_contains_form(self):
        form = self.response.context.get('form')
        self.assertIsInstance(form, SignUpForm)

class SuccessfulSignUpTests(TestCase):
    def setUp(self):
        url = reverse('signup')
        data = {
            'username': 'john',
            'email': 'john@doe.com',
            'password1': 'abcdef123456',
            'password2': 'abcdef123456'
        }
        self.response = self.client.post(url, data)
        self.home_url = reverse('home')

    # ...

البته کلاس تست قبلی هنوز هم کار می کند. چون نکتۀ طلایی اینجاست که در فرم جدید ما، فرم UserCreationForm را توسعه داده است.

ببینیم واقعا چه اتفاقی افتاده. ما یک فیلد را به فرم اضافه کرده‌ایم.

fields = ('username', 'email', 'password1', 'password2')

و این قطعه کد به صورت خودکار در فایل HTML منعکس شده است.

حالا فرض کنیم که یک برنامه‌نویس دیگر درآینده بخواهد فرم ثبت نام را توسعه دهد. با این کار، هر فیلدی که به فرم ثبت نام اضافه شود، در خروجی مرورگر هم نمایش داده می شود و این در حالی باشد که ما نخواهیم چنین اتفاقی بیفتد.

خوب! نوبت به فایل تست می رسد:

accounts/tests.py

class SignUpTests(TestCase):
    # ...

    def test_form_inputs(self):
        '''
        The view must contain five inputs: csrf, username, email,
        password1, password2
        '''
        self.assertContains(self.response, '<input', 5)
        self.assertContains(self.response, 'type="text"', 1)
        self.assertContains(self.response, 'type="email"', 1)
        self.assertContains(self.response, 'type="password"', 2)

ترجمۀ اختصاصی توسط تمدن

 

مطلب بعدی: بهبود وضعیت فایل های تست

مطلب قبلی:  تست ویوی ثبت نام

0 پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگو شرکت کنید؟
نظری بدهید!

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *