Как я могу создавать пользовательских пользователей только с формами? - PullRequest
0 голосов
/ 01 мая 2019

Я новичок в Django и использую версию 2.2. Я создал форму пользователя для подписи пользователя на сайте, но он не может добавить другую информацию о полях в базу данных

Я пытался добавить другие поля в список полей, добавить добавить поля, но ничего не работает`

forms.py

from django import forms
from django.contrib.auth import (
    authenticate,
    get_user_model

)

User = get_user_model()


class UserRegisterForm(forms.ModelForm):
    username = forms.CharField(label='PUsername')
    email = forms.EmailField(label='Email address')
    email2 = forms.EmailField(label='Confirm Email')
    password = forms.CharField(widget=forms.PasswordInput,label='Password')
    password2 = forms.CharField(widget=forms.PasswordInput,label='ConfirmPassword')
    age = forms.CharField(label='your age')
    info = forms.CharField(label='info about you')

    class Meta:
        model = User
        fields = [
            'username',
            'email',
            'email2',
            'password',
            'password2',
            'age'
            'info'
        ]

    def clean(self, *args, **kwargs):
        username = self.cleaned_data.get('email')
        email = self.cleaned_data.get('email')
        email2 = self.cleaned_data.get('email2')
        password = self.cleaned_data.get('password')
        password2 = self.cleaned_data.get('password2')
        if email != email2:
            raise forms.ValidationError("Emails must match")
        email_qs = User.objects.filter(email=email)
        if password != password2:
            raise forms.ValidationError("Passwords must match")
        email_qs = User.objects.filter(email=email)
        if email_qs.exists():
            raise forms.ValidationError(
                "This email has already been registered")
        username_ex = User.objects.filter(username=username)
        if username_ex.exists():
            raise forms.ValidationError("This username is taken")
        return super(UserRegisterForm, self).clean(*args, **kwargs)

views.py

from django.shortcuts import render, redirect

from django.contrib.auth import authenticate,get_user_model,login,logout


from .forms import CreateUserForms
import random
import string



def register_view(request):
    if request.method=='POST':
        frm=CreateUserForm(request.POST)
        if frm.is_valid():
            username, email, password = frm.cleaned_data['username'], frm.cleaned_data['email'], frm.cleaned_data['password1']
            new_user = User.objects.create_user(username, email, password)
            new_user.is_active = True # if you want to set active
            new_user.save()
    else:
        frm=CreateUserForm()
    return render(request,'registration/signup.html',{'form':frm})

def logout_view(request):
    logout(request)
    return redirect('/')

Ожидаемые результаты - рабочая форма, но фактические результаты сохраняют только имя пользователя, пароль и адрес электронной почты

Ответы [ 2 ]

0 голосов
/ 01 мая 2019

Название вашего вопроса:

Как я могу создавать пользовательских пользователей только с формами?

Ответ на этот вопрос: это невозможно.Все, что вы хотите сохранить в базе данных, вы должны иметь соответствующую модель для этого.Формы определяют только то, какие данные отправляются клиентами и как эти данные обрабатываются.

Поэтому, если вы хотите сохранить столбцы age и info для своих пользователей, вам придется создать Model и соответствующие таблицы и столбцы в вашей базе данных для хранения этих значений.

Теперь модель Django User по умолчанию принимает только username, email и password (плюс некоторые логические значения, такие как * 1018)*, is_superuser, is_active и т.д ...).Если вы хотите сохранить дополнительную информацию, у вас есть несколько вариантов, которые хорошо описаны в официальных документах , либо путем расширения модели по умолчанию User, либо путем ее замены.

Рекомендацияпри запуске нового проекта Django всегда необходимо хотя бы заменить свою собственную User модель (см. this ).Если у вас будет только один тип пользователей, добавьте поля age и info в свою пользовательскую модель User.Но если есть вероятность, что у вас могут быть пользователи разных типов, для которых age и info могут быть неактуальны в будущем, расширьте свою пользовательскую модель User профилем.

0 голосов
/ 01 мая 2019

читайте документацию по python super.вы используете это неправильно.Вызов super в конце метода clean означает, что он выполняет чистый метод и код модели формы перед тем, как super будет изменен.

...