如何在使用基于类的视图注册后立即登录用户?

2024-03-27

我正在一个销售图像的网站上工作,我正在尝试找到一种方法,以便用户可以login注册后使用class基于视图,我已经使用基于函数的视图完成了它,但我想基于类进行它,因为它需要更少的代码。

下面是与function基于的观点:

My models.py:

from django.db import models
from django.contrib.auth.models import User


class JobType(models.Model):
    job_name = models.CharField(max_length=50)

    def __str__(self):
        return self.job_name


class Country(models.Model):
    country_name = models.CharField(max_length=50)

    def __str__(self):
        return self.country_name


class IndianState(models.Model):
    state_name = models.CharField(max_length=30)

    def __str__(self):
        return self.state_name


class SignUpModel(User):
    company_name = models.CharField(max_length=80)
    job = models.ForeignKey(JobType, on_delete=models.CASCADE)
    mobile_no = models.PositiveIntegerField()
    country = models.ForeignKey(
        Country, on_delete=models.CASCADE, blank=True)
    state = models.ForeignKey(IndianState, on_delete=models.CASCADE)

forms.py

from django import forms
from django.contrib.auth.forms import AuthenticationForm, UsernameField
from django.utils.translation import gettext, gettext_lazy as _
from django.core import validators
from .models import JobType, SignUpModel


class MyAuthenticationForm(AuthenticationForm):
    username = UsernameField(widget=forms.TextInput(attrs={'autofocus': True}))
    password = forms.CharField(
        label=_("Password"),
        strip=False,
        widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
    )

    error_messages = {
        'invalid_login': _(
            "Please enter a correct %(username)s and password."
        ),
        'inactive': _("This account is inactive."),
    }


class LoginForm(MyAuthenticationForm):
    username = UsernameField(widget=forms.TextInput(
        attrs={"autofocus": True, "class": 'form-control', 'placeholder': 'Enter Username'}), error_messages={'required': 'Enter Username'})
    password = forms.CharField(
        strip=False,
        widget=forms.PasswordInput(
            attrs={'placeholder': "Enter Password", 'class': 'form-control', 'auto-complete': 'current-password'}),
        error_messages={'required': 'Enter Password'}
    )


class SignUpForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['job'].empty_label = 'Select Job Description'
        self.fields['country'].empty_label = 'Select Country'
        self.fields['state'].empty_label = 'Select State'

    first_name = forms.CharField(widget=forms.TextInput(
        attrs={'placeholder': 'First Name', 'class': 'form-control'}), required=True, error_messages={'required': 'First Name is required'})
    last_name = forms.CharField(widget=forms.TextInput(
        attrs={'placeholder': 'Last Name', 'class': 'form-control'}), required=True, error_messages={'required': 'Last Name is required'})
    email = forms.EmailField(widget=forms.EmailInput(
        attrs={'placeholder': 'Email Address', 'class': 'form-control'}), required=True, error_messages={'required': 'Email Address is required'})
    mobile_no = forms.CharField(widget=forms.NumberInput(
        attrs={'placeholder': 'Mobile Number', 'class': 'form-control'}), validators=[validators.MinLengthValidator(10), validators.MaxLengthValidator(10)])
    password = forms.CharField(widget=forms.PasswordInput(
        attrs={'placeholder': 'Enter Password', 'class': 'form-control'}), validators=[validators.MinLengthValidator(8)], error_messages={'required': 'Enter Password'})

    class Meta:
        model = SignUpModel
        fields = ['username', 'first_name', 'last_name', 'email', 'password',
                  'company_name', 'job', 'mobile_no', 'country', 'state']
        widgets = {
            'company_name': forms.TextInput(attrs={'placeholder': 'Company Name', 'class': 'form-control'}),
            'mobile_no': forms.NumberInput(attrs={'placeholder': 'Mobile Number', 'class': 'form-control'}),
            'username': forms.TextInput(attrs={'placeholder': 'Your Username', 'class': 'form-control'}),
            'job': forms.Select(attrs={'class': 'form-control'}),
            'country': forms.Select(attrs={'class': 'form-control'}),
            'state': forms.Select(attrs={'class': 'form-control'})

        }
        error_messages = {
            'username': {
                'required': _('Username must be given')
            },
            'password': {
                'required': _('password is required')
            },
            'mobile_no': {
                'required': _('Mobile Number is required')
            },
            'company_name': {
                'required': _('Company Name is required')
            },
            'job': {
                'required': _('Job description must be selected')
            },
            'state': {
                'required': _('State Name is required')
            }
        }

记住 :在这里,我已经覆盖django's为我的目的而形成。

views.py

from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.contrib.auth import authenticate, login, logout
from django.contrib import messages
from about.models import SignUpModel
from . forms import LoginForm
from django.views.generic.base import TemplateView
from django.contrib.auth.views import LoginView, LogoutView
from . forms import SignUpForm
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login
from django.contrib import messages
from django.contrib.auth.hashers import make_password
from django.contrib.auth import login, authenticate

# @cache_page(60*60*24)


def about_first_page(request):
    return render(request, 'aboutus/home.html')


# @cache_page(60*60*24)
def pricing(request):
    return render(request, 'aboutus/pricing.html')


class MyLoginView(LoginView):
    template_name = 'aboutus/registration.html'
    authentication_form = LoginForm


class MyLogoutView(LogoutView):
    template_name = 'aboutus/logout.html'


@method_decorator(login_required(login_url='/about/registration/'), name='dispatch')
class UserMyAccounts(TemplateView):
    def get(self, request, *args, **kwargs):
        return super().get(request, *args, **kwargs)
    template_name = 'aboutus/myaccounts.html'


def sign_up(request):
    if request.method == 'POST':
        form = SignUpForm(request.POST)
        if form.is_valid():
            un = form.cleaned_data['username']
            pword = make_password(form.cleaned_data['password'])

            fname = form.cleaned_data['first_name']
            lname = form.cleaned_data['last_name']
            em = form.cleaned_data['email']
            compname = form.cleaned_data['company_name']
            job = form.cleaned_data['job']
            mobno = form.cleaned_data['mobile_no']
            country = form.cleaned_data['country']
            state = form.cleaned_data['state']
            sign_up_prop = SignUpModel(first_name=fname, last_name=lname,
                                       username=un, password=pword, email=em,
                                       company_name=compname, job=job, mobile_no=mobno, country=country, state=state)
            sign_up_prop.save()

            """username and password from request"""
            un_request = request.POST.get('username')
            pass_request = request.POST.get('password')

            authen = authenticate(
                request, username=un_request, password=pass_request)
            if authen is not None:
                login(request, authen)
                return HttpResponseRedirect('/about/myaccounts/')

    else:
        form = SignUpForm()
    return render(request, 'aboutus/sign-up.html', {'form': form})

urls.py

from django import views
from django.urls import path
from about import views
from django.contrib.auth import views as auth_views
from django.views.generic.base import TemplateView
from .forms import LoginForm
urlpatterns = [
    path('', views.about_first_page, name='about_first_page'),
    path('pricing', views.pricing, name='pricing'),
    path('registration/', views.MyLoginView.as_view(), name='login'),
    path('logout/', views.MyLogoutView.as_view(), name='logout'),
    path('sign-up/', views.sign_up, name='sign-up'),
    path('myaccounts/', views.UserMyAccounts.as_view(), name='myaccounts')
]

上面与function基于视图,它工作正常,但我什么时候开始这样做class基于观点,我在这一点上陷入了困境:

所有其他files是一样的。

This is views.py with class基于视图:

class SignUpView(CreateView):
    form_class = SignUpForm
    template_name = 'aboutus/sign-up.html'
    success_url = '/about/myaccounts/'

那么,我怎样才能做同样的事情class based?


您可以使用form_valid[Django 文档] https://docs.djangoproject.com/en/4.0/ref/class-based-views/flattened-index/#createview method

class SignUpView(CreateView):
  form_class = SignUpForm
  template_name = 'aboutus/sign-up.html'
  success_url = '/about/myaccounts/'
  
  def form_valid(self, form):
      response = super().form_valid(form)
      user = form.save()
      login(self.request, user, backend='django.contrib.auth.backends.ModelBackend')
      return response

Update

更新你的forms.py

from django.contrib.auth.forms import UserCreationForm

class SignUpForm(UserCreationForm):
    ....

如果上述解决方案不适合您,那么您可以通过覆盖表单保存方法来散列密码

from django.contrib.auth.hashers import make_password

    class SignUpForm(forms.ModelForm):
        ....
        def save(self, commit=True):
            user = super(SignUpForm, self).save(commit=False)
            raw_password = make_password(
              self.cleaned_data["password"]
            )
            if commit:
               user.save()
            return user
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在使用基于类的视图注册后立即登录用户? 的相关文章

  • 如何将 UPX 与 pyinstaller 一起使用?

    如何将 UPX 与 pyinstaller 一起使用 我正在关注文档 我已经下载了UPX 我的文件如下所示 import csv import selenium import pandas print Hello 然后我运行 pyinsta
  • TCP打孔问题

    我尝试使用 Python 3 中概述的原则为防火墙编写一个基本的 TCP 打孔器本文 http www bford info pub net p2pnat index html 不过 我无法连接任何东西 这是代码 usr bin pytho
  • python中嵌套字典值的总和

    我有一本这样的字典 data 11L a 2 b 1 a 2 b 3 22L a 3 b 2 a 2 b 5 a 4 b 2 a 1 b 5 a 1 b 0 33L a 1 b 2 a 3 b 5 a 5 b 2 a 1 b 3 a 1 b
  • 使用 Matplotlib 的范围绘制图像的 3D 轮廓

    正如我所介绍的here https stackoverflow com questions 18792624 fits image input to a range in plot python 在二维中 我想知道如何 缩放 要绘制到绘图中
  • Tensorflow 训练期间 GPU 使用率非常低

    我正在尝试为 10 类图像分类任务训练一个简单的多层感知器 这是 Udacity 深度学习课程作业的一部分 更准确地说 任务是对各种字体呈现的字母进行分类 数据集称为 notMNIST 我最终得到的代码看起来相当简单 但无论如何我在训练期间
  • 使用 NumPy 的 Mittag-Leffler 函数的不稳定性

    在尝试重现时Wolfram MathWorld 上的情节 http mathworld wolfram com Mittag LefflerFunction html 并试图帮助这个问题 https stackoverflow com qu
  • Django“模型”对象不可迭代

    我有一张表 其中显示了已注册的员工 我想根据他们的数据库生成一个简单的 HTML 页面 其中包括他们的姓名 id 职称等 为此 我将一个 id 传递给视图 以便它可以获取相应用户的详细信息并向我显示 一切正常 直到出现错误对象不可迭代 下面
  • 如何使用appium自动化Android手机后退按钮

    我正在使用 Appium python 客户端库 对 Android 上的混合移动应用程序进行测试自动化 我无法找到任何方法来自动化或创建手势以使用 电话后退 按钮返回到应用程序的上一页 有没有可以使用的驱动函数 我尝试了 self dri
  • django ajax post 403被禁止

    使用 django 1 4 当我尝试从我的 javascript 做我的 django 服务器上的帖子时 我收到 403 错误 我的 get 工作正常 尽管问题仅出在帖子上 也尝试过 csrf exempt但没有运气 更新 我现在可以发布我
  • 导入我自己的模块时出现“ImportError:没有名为...的模块”

    我正在尝试导入模块 但不断收到导入错误 在 PortfolioStatus py 文件中 我有以下代码 它从 share data py 模块导入 share data 类 from Shares share data import sha
  • Tkinter 如何根据此组合框自动更新第二个组合框

    我在 Tkinter Python 中遇到了组合框更新的问题 我有两个组合框 组合框A with values A B C and 组合框B 我想要的是 当值A在组合框中选择A然后在组合框中B显示值 1 2 3 当值B在组合框中选择A然后在
  • 如何在 matplotlib 中第一个 x 轴的底部添加第二个 x 轴?

    我指的是已经提出的问题here https stackoverflow com questions 10514315 how to add a second x axis in matplotlib 在此示例中 用户通过将第二个轴添加到与标
  • 枚举上的 random.choice

    我想用random choice on an Enum I tried class Foo Enum a 0 b 1 c 2 bar random choice Foo 但是这段代码失败了KeyError 我怎样才能随机选择一个成员Enum
  • 返回吃异常

    我至少发现了以下行为weird def errors try ErrorErrorError finally return 10 print errors prints 10 It should raise NameError name E
  • 如何使用资源模块来衡量函数的运行时间?

    我想使用Python代码测量函数的CPU运行时间和挂钟运行时间 此处建议资源模块 如何以 Python 代码 不是从终端 的形式分别测量函数的 CPU 运行时间和挂钟运行时间 https stackoverflow com q 192046
  • Pandas:按日历周分组,然后绘制真实日期时间的分组条形图

    EDIT 我找到了一个非常好的解决方案并将其发布在下面作为答案 结果将如下所示 您可以为此问题生成一些示例数据 codes list ABCDEFGH dates pd Series pd date range 2013 11 01 201
  • Python 对列表中的值求和(如果它存在于另一个列表中)

    我有一个列表和一组 a list 1 2 2 1 1 1 b list 1 2 我正在寻找对应 b list 中的项目并将它们从 a list 中的值相加 以便输出为 1 3 2 1 我尝试过的 sum 0 for i in a list
  • PyMC3 和 Theano - 导入 pymc3 后,有效的 Theano 代码停止工作

    一些简单的 theano 代码可以完美运行 当我导入 pymc3 时停止工作 这里有一些片段可以重现错误 Initial Theano Code this works import theano tensor as tsr x tsr ds
  • Python Pandas:向类 pandas.core.series.Series 添加方法

    我想在 Python 中处理时间序列 因此 Pandas 的 Series 类非常完美 并且有很多有用的方法 现在我想添加一些我需要但未实现的方法 例如 假设我有兴趣添加一个方法 该方法将两次一值附加到时间序列中 让我们调用该方法appen
  • 如何继承并重写 django 模型类来创建 listOfStringsField?

    我想为 django 模型创建一个新类型的字段 它基本上是一个 ListOfStrings 因此 在您的模型代码中 您将具有以下内容 模型 py from django db import models class ListOfString

随机推荐