为什么不保存此表格?

问题描述 投票:0回答:1

下面的代码现在是一个简单的帐户注册,当我提交此表单时,它会将我重定向到主页,这意味着我的表单有效并且可以运行,但是当我查看“管理”页面时,我看到该帐户尚未注册,我没有错。因此,我在这里可以了解到我的代码已经可以运行了,但是尚未保存。那么,如何通过FormView保存成员?在此先感谢

views.py

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.views.generic import TemplateView, View
from django.views.generic.edit import FormView, CreateView
from .forms import UserForm
from .models import User
from django.urls import reverse_lazy


class IndexView(TemplateView):
    template_name = "accounts/index.html"


class ProfileView(CreateView):
    template_name = 'accounts/register.html'
    success_url = reverse_lazy('accounts:index')
    form_class = UserForm

forms.py

from django import forms
from .models import User


class UserForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)
    password2 = forms.CharField(label="Confirm Password", widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = '__all__'
        exclude = ('staff', 'active', 'admin', 'last_login')

    def clean_password2(self):
        password = self.cleaned_data['password']
        password2 = self.cleaned_data['password2']
        if password and password2 and password != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

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

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data['password'])

        if commit:
            user.save()
        return user

models.py

from django.db import models
from django.contrib.auth.models import (AbstractBaseUser, BaseUserManager)
from django.db.models.signals import post_save
from django.dispatch import receiver


class UserManager(BaseUserManager):

    def create_user(self, email, password, username, is_staff=True, is_admin=True, is_active=True):
        if not email:
            raise ValueError("This email is invalid")
        if not password:
            raise ValueError("This Password is invalid")
        if not username:
            raise ValueError("This Username is invalid")
        user = self.model(
            email=self.normalize_email(email)
        )
        user.staff = is_staff
        user.admin = is_admin
        user.active = is_active
        user.set_password(password)
        user.username = username
        user.save(using=self._db)
        return user

    def create_staffuser(self, email, password, username):
        user = self.create_user(
            email,
            password=password,
            username=username,
            is_staff=True,
        )
        return user

    def create_superuser(self, email, password, username):
        user = self.create_user(
            email=email,
            password=password,
            username=username,
            is_staff=True,
            is_admin=True,
        )
        return user


class User(AbstractBaseUser):
    email = models.EmailField(max_length=255, unique=True, verbose_name="Email")
    first_name = models.CharField(max_length=255, verbose_name="First Name")
    last_name = models.CharField(max_length=255, verbose_name="Last Name")
    username = models.CharField(max_length=50, unique=True, verbose_name="Username")
    active = models.BooleanField(default=True, verbose_name="Active")
    staff = models.BooleanField(default=False, verbose_name="Staff")
    admin = models.BooleanField(default=False, verbose_name="Admin")
    timestamp = models.DateTimeField(auto_now_add=True, verbose_name="Time Stamp")

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = ["username"]
    objects = UserManager()

    def __str__(self):
        return self.username

    def get_short_name(self):
        return self.username

    def get_full_name(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    article = models.TextField(blank=True, max_length=500, verbose_name="Article")


def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = User.objects.create(user=kwargs['instance'])


post_save.connect(receiver=create_profile, sender=User)
django formview
1个回答
2
投票

因为FormView不是save()表格。它可以用于任何形式,而不仅限于ModelForm。并非每个Form都有save()方法。

FormViewform_valid()中的唯一操作是重定向到成功URL。您必须告诉自己在验证表单有效之后要做什么:

def form_valid(self, form):
    form.save()
    return super().form_valid(form)

您可以看到FormView here的内部工作原理。

您可以使用CreateView代替FormView。这样可以为您节省开支。

© www.soinside.com 2019 - 2024. All rights reserved.