python - django:如何将基于类的视图与基于函数的视图合并
问题描述
出于某种原因,我想在我的模板中使用基于 django 类的表单视图“PasswordResetView”,该模板已经有一个基于函数的视图,即主视图,所以我认为我应该从 django 的源代码中复制粘贴“PasswordResetView”到我的views.py 文件并更改所需的内容,但我总是遇到一些错误,因为我不熟悉基于类的视图
,这是我在 views.py 文件中的视图:
def home(request):
user = request.user
signin_form = SigninForm()
signup_form = SignupForm()
if 'signin_form' in request.POST:
signin_form = SigninForm(request.POST)
if signin_form.is_valid():
email = request.POST['email']
password = request.POST['password']
user = authenticate(email=email, password=password)
if user:
login(request, user)
elif user is None:
messages.error(request, 'ُEmail or password is incorrect')
if 'signup_form' in request.POST:
signup_form = SignupForm(request.POST)
if signup_form.is_valid():
signup_form.save()
full_name = signup_form.cleaned_data.get('full_name')
email = signup_form.cleaned_data.get('email')
raw_password = signup_form.cleaned_data.get('password1')
account = authenticate(email=email, password=raw_password)
login(request, account)
context = {'signin_form': signin_form,'signup_form': signup_form}
return render(request, 'main/home.html', context)
这是 django 源代码中的“PasswordResetView”:
from django.urls import reverse, reverse_lazy
from django.contrib.auth.tokens import default_token_generator
from django.views.generic.edit import FormView
from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator
class PasswordContextMixin:
extra_context = None
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context.update({
'title': self.title,
**(self.extra_context or {})
})
return context
class PasswordResetView(PasswordContextMixin, FormView):
email_template_name = 'registration/password_reset_email.html'
extra_email_context = None
form_class = PasswordResetForm
from_email = None
html_email_template_name = None
subject_template_name = 'registration/password_reset_subject.txt'
success_url = reverse_lazy('password_reset_done')
template_name = 'registration/password_reset_form.html'
title = _('Password reset')
token_generator = default_token_generator
@method_decorator(csrf_protect)
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
def form_valid(self, form):
opts = {
'use_https': self.request.is_secure(),
'token_generator': self.token_generator,
'from_email': self.from_email,
'email_template_name': self.email_template_name,
'subject_template_name': self.subject_template_name,
'request': self.request,
'html_email_template_name': self.html_email_template_name,
'extra_email_context': self.extra_email_context,
}
form.save(**opts)
return super().form_valid(form)
INTERNAL_RESET_SESSION_TOKEN = '_password_reset_token'
在我的 urls.py
path('', views.home, name='home'),
解决方案
您可以将基于类的视图与基于函数的视图一起使用。你所需要的只是写下所有的路线urls.py
from django.contrib.auth import views as auth_views
path('', views.home, name='home'),
path('password-reset', auth_views.PasswordResetView.as_view() ,name='password-reset'),
推荐阅读
- python-3.x - 有没有更简单的方法在 python 3 中的桌面应用程序中创建前端?
- go - 使用 golang 查询中的 ID 从 Firestore GCP 获取文档
- php - 当 PHP 脚本使用 Supervisor 运行时,Sentry 没有记录
- sql-server - SQL Server 数据库备份大小变化
- go - golang 检查 udp 端口是否打开
- javascript - 用于云台控制的 Vue.js 小部件
- go - 指针切片别名的范围
- java - simpleframework 转换元素
- javascript - 在 RxJs 中实现具有固定堆栈的排队系统
- laravel - 如何使用碳计算总时间