【问题标题】:django: how to merge a class based view with a function based viewdjango:如何将基于类的视图与基于函数的视图合并
【发布时间】:2021-01-24 15:05:51
【问题描述】:

出于某种原因,我想在我的模板中使用基于 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'),

【问题讨论】:

    标签: python django django-forms django-views django-class-based-views


    【解决方案1】:

    我假设您想在不更改页面的情况下从您的home view 访问PasswordResetView 的表单,如果是这样,您不必为PasswordResetView 提供基于类的视图。

    您需要做的就是导入 django 内置的auth views

    urls.py

    from django.contrib.auth import views as auth_views
    
    path('', views.home, name="home"), # your home page url
    
    # password reset url
    path('', auth_views.PasswordResetView.as_view(template_name="myapp/home.html"), name="password_reset"), 
    

    在您的模板中 (home.html)

    <form action="{% url 'password_reset' %}" method="POST">
       {% csrf_token %}
       {{form.as_p}}
       <button type="submit">Submit</button>
    </form>
    

    现在,每当您单击提交按钮时,django 都会转到 password_reset 网址并为您完成这项工作。

    【讨论】:

    • 我试过了,但没有用,该表单没有在模板上显示它是空白的,它只呈现了按钮,(在 auth_views 中没有名为 password_reset 的属性,我必须将其更改为PasswordResetView 我会编辑你的答案)
    • 哦,是的,这是我的错误,我从未注意到这一点。
    • 你有什么其他的解决方案吗!
    • 你卡在哪里了
    【解决方案2】:

    您可以将基于类的视图与基于函数的视图一起使用。你只需要在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'),
    

    【讨论】:

    • 但是这样我只能在不同的模板上使用它,而不是在我不想要的主页模板中使用它
    猜你喜欢
    • 2014-02-16
    • 2021-05-30
    • 2021-03-28
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多