Как создать форму регистрации для модели пользователя клиента в Django? - PullRequest
0 голосов
/ 20 июня 2019

Я расширил пользовательскую модель, предоставленную Django, в Owner объект.Я собираюсь создать форму регистрации, которая создаст нового пользователя в моем приложении, а также заполнить настраиваемые поля, определенные в объекте Owner.Мой код выглядит следующим образом -

model.py -

class Owner(BaseModel):

    id = models.AutoField(primary_key=True)
    gym = models.ForeignKey(Gym, on_delete = models.CASCADE)
    # User model
    user = models.OneToOneField(User, on_delete = models.CASCADE)
    address = models.OneToOneField('Address', on_delete=models.CASCADE)

    contact =  models.BigIntegerField(null=False)
    dob = models.DateTimeField(null=True)
    gender =  models.CharField(max_length=10, choices=GENDER_CHOICES, null=True, default=None)

    profile_photo = models.ImageField( upload_to='static/images/gym_owner/profile', null=True, blank=True)

    def __str__(self):
        return f'{self.user.first_name} {self.user.last_name}'


    class Meta:
        verbose_name_plural = "Owner"


@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Owner.objects.create(user=instance)
    instance.owner.save()

В общем, модель Owner расширяет модель User с помощью метода отношений One-to-One.И есть метод получения сигнала, который создает объект Owner при создании объекта User.

Forms.py -

class OwnerForm(ModelForm):
    class Meta:
        model = Owner
        fields = ('gym', 'address', 'contact', 'gender',  'profile_photo')

Форма в основном содержит поля, которые я хочу расширить Пользовательмодель с.

и view.py -

@transaction.atomic
def owner_signup(request):
    if request.user.is_authenticated:
        return redirect('dashboard')
    if request.method == 'GET':
        userForm = UserCreationForm()
        ownerForm = OwnerForm()
        return render(request, 'gym_owner/signup.html', {'userform': userForm, 'ownerForm': ownerForm})
    if request.method == 'POST':
        userForm = UserCreationForm(request.POST)
        ownerForm = OwnerForm(request.POST)

        if userForm.is_valid() and ownerForm.is_valid():
            user = userForm.save()
            user.refresh_from_db()
            ownerForm = OwnerForm.save(request.POST, instance=user.owner)
            ownerForm.full_clean()
            ownerForm.save()
            #form.save()
            username = userForm.cleaned_data.get('username')
            password = userForm.cleaned_data.get('password1')
            user = authenticate(username=username, password=password)
            login(request, user)
            return render(request, 'gym_owner/dashboard.html')
        else:
            # If there were errors, we render the form with these
            # errors
            return render(request, 'gym_owner/signup.html', {'userform': userForm, 'ownerForm': ownerForm})

Приведенный выше код использует this в качестве ссылки.Приведенный выше код в основном создает UserCreationForm, предоставленный Django, который используется для создания пользователя, и как только пользователь сохраняется в db, на нем создается объект Owner.Однако, когда я нажимаю на кнопку отправить, возникает ошибка.

  1. При отправке формы - ниже приведена форма, представленная Джанго

Form

После отправки я получаюследующая ошибка -

IntegrityError at /owner/signup
NOT NULL constraint failed: gym_owner_owner.contact
Request Method: POST
Request URL:    http://localhost:8000/owner/signup
Django Version: 2.2.2
Exception Type: IntegrityError
Exception Value:    
NOT NULL constraint failed: gym_owner_owner.contact
Exception Location: C:\Users\Dev\Desktop\Django-Test\venv\lib\site-packages\django\db\backends\sqlite3\base.py in execute, line 383
Python Executable:  C:\Users\Dev\Desktop\Django-Test\venv\Scripts\python.exe
Python Version: 3.6.6
Python Path:    
['C:\\Users\\Dev\\Desktop\\Django-Test\\gym',
 'C:\\Users\\Dev\\Desktop\\Django-Test\\venv\\Scripts\\python36.zip',
 'C:\\Users\\Dev\\Desktop\\Django-Test\\venv\\DLLs',
 'C:\\Users\\Dev\\Desktop\\Django-Test\\venv\\lib',
 'C:\\Users\\Dev\\Desktop\\Django-Test\\venv\\Scripts',
 'c:\\users\\Dev\\appdata\\local\\programs\\python\\python36-32\\Lib',
 'c:\\users\\Dev\\appdata\\local\\programs\\python\\python36-32\\DLLs',
 'C:\\Users\\Dev\\Desktop\\Django-Test\\venv',
 'C:\\Users\\Dev\\Desktop\\Django-Test\\venv\\lib\\site-packages']
Server time:    Thu, 20 Jun 2019 05:49:02 +0000

1 Ответ

0 голосов
/ 20 июня 2019

Поле контакта в модели, вероятно, должно быть

Не требует ввода: contact = models.CharField (max_length = 10, null = True, пусто = True)

Требуетсяinput: contact = models.CharField (max_length = 10)

Если вы используете IntegerField для номера телефона, обычно люди вводят «-» или «.»между наборами чисел (123-123-1234) это приведет к ошибке.

Но если вы хотите сохранить его как целое число, это будет: contact = models.IntegerField ()

Django документы для него здесь https://docs.djangoproject.com/en/2.2/topics/db/models/#fields

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...