RegisterForm () отсутствует 1 обязательный позиционный аргумент: 'запрос' - PullRequest
1 голос
/ 21 января 2020

Итак, я делаю пользовательскую модель. Это то, за чем я следую Здесь . Я в значительной степени следовал этому уроку, но все же не могу его сделать.

Ошибка: RegisterForm () отсутствует 1 обязательный позиционный аргумент: 'request'.

вот мой код.

forms.py

from django import forms
from django.contrib.auth.forms import ReadOnlyPasswordHashField

from .models import User

class UserAdminCreationForm(forms.ModelForm):
    """
    A form for creating new users. Includes all the required
    fields, plus a repeated password.
    """
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('email',)

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super(UserAdminCreationForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user


class UserAdminChangeForm(forms.ModelForm):
    """A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = User
        fields = ('email', 'password', 'active', 'admin')

    def clean_password(self):
        # Regardless of what the user provides, return the initial value.
        # This is done here, rather than on the field, because the
        # field does not have access to the initial value
        return self.initial["password"]

class LoginForm(forms.ModelForm):
    email   = forms.EmailField(label='Email')
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('email', 'password',)

        widgets = {

                'email' : forms.EmailInput(
                    attrs={'class':'form-control', 'place_holder': '', }),

                'password' : forms.PasswordInput(
                    attrs={'class':'form-control' }),

                    }



class RegisterForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    password2 = forms.CharField(label='Confirm password', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('email',)

    def clean_email(self):
        email = self.cleaned_data.get('email')
        qs = User.objects.filter(email=email)
        if qs.exists():
            raise forms.ValidationError("email is taken")
        return email

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2


models.py

from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)

class UserManager(BaseUserManager):
    def create_user(self, email, full_name, password=None, is_staff=False, is_active=True, is_admin=False):
        """
        Creates and saves a User with the given email and password.
        """
        if not email:
            raise ValueError('Users must have an email address')
        if not full_name:
            raise ValueError('Users must have an full name')
        if not password:
            raise ValueError('Users must have a password')

        user = self.model(
            email=self.normalize_email(email),
        )
        user.full_name = full_name
        user.set_password(password)
        user.staff = is_staff
        user.admin = is_admin
        user.active = is_active
        user.save(using=self._db)
        return user

    def create_staffuser(self, email, password):
        """
        Creates and saves a staff user with the given email and password.
        """
        user = self.create_user(
            email,
            password=password,
        )
        user.staff = True
        user.save(using=self._db)
        return user

    def create_superuser(self, email, full_name, password):
        """
        Creates and saves a superuser with the given email and password.
        """
        user = self.model(
            email=self.normalize_email(email)
        )
        user.full_name = full_name
        user.set_password(password)
        user.full_name = full_name
        user.staff = True
        user.admin = True
        user.save(using=self._db)
        return user


# Create your models here.

class User(AbstractBaseUser):
    email                   = models.EmailField(max_length=255, unique=True)
    full_name               = models.CharField(max_length=255, null=True, blank=True)
    active                  = models.BooleanField(default=True) # to login
    staff                   = models.BooleanField(default=False) # a admin user; non super-user
    admin                   = models.BooleanField(default=False) # a superuser
    created_date            = models.DateTimeField(auto_now_add=True)


    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['full_name'] # Email & Password are required by default.

    objects = UserManager()

    def __str__(self):         
        return self.email

    def get_full_name(self):
        # The user is identified by their email address
        return self.email

    def get_short_name(self):
        # The user is identified by their email address
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True


    @property
    def is_staff(self):
        "Is the user a member of staff?"
        return self.staff

    @property
    def is_admin(self):
        "Is the user a admin member?"
        return self.admin

    @property
    def is_active(self):
        "Is the user active?"
        return self.active

class Account_type(models.Model):
    name                    = models.CharField(max_length=50, null=True, blank=True) 

class Profile(models.Model):
    user                    = models.OneToOneField(User, on_delete=models.CASCADE)
    account_type            = models.ForeignKey(Account_type, on_delete=models.CASCADE) 


регистр. html

from django.shortcuts import render, redirect
from . forms import RegisterForm, LoginForm

# Create your views here.

def RegisterForm(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            form.save()        
    else:
        form = RegisterForm()

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

Просмотр логи c просто, как вы можете видеть. Просто сохраняю запрос в базу данных. Сам учебник ничего не говорил о просмотре для входа в систему и регистрации.

Итак, что я тут не так делаю. Спасибо

1 Ответ

2 голосов
/ 21 января 2020

Проблема в том, что ваше представление RegisterForm имеет то же имя, что и ваша форма, поэтому, если вы вызовете RegisterForm в своем представлении, оно преобразуется в функцию представления и выполнит рекурсивный вызов.

Обычно (верхнего уровня) функции записываются в snake_case, поэтому вы можете переписать его в register_form или даже лучше register (так как это вообще не форма):

from django.shortcuts import render, redirect
from . forms import <b>RegisterForm</b>, LoginForm

# Create your views here.

def <b>register</b>(request):
    if request.method == 'POST':
        form = RegisterForm(request.POST)
        if form.is_valid():
            form.save()
            return <b>redirect(<i>'some-view-name'</i>)</b>
    else:
        form = RegisterForm()

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

Обычно успешный POST-запрос приводит к перенаправлению для реализации шаблона Post / Redirect / Get [wiki] . Поэтому я настоятельно рекомендую вам использовать redirect(..) [Django -doc] и заменить some-view-name именем вида, для которого вы хотите перенаправить.

...