【问题标题】:Converting a function based view to a class based view with only a form and no model (object)将基于函数的视图转换为仅具有表单且没有模型(对象)的基于类的视图
【发布时间】:2012-02-21 05:32:49
【问题描述】:

现在,这就是在用户配置文件中更改密码的方式。在不涉及模型的情况下将其转换为基于类的视图的最佳方法是什么?

这是修改密码的视图

@login_required
def profile_change_password(request):
    """ 
    Change password of user.
    """
    user = get_object_or_404(User, username__iexact=request.user.username)

    if request.method == 'POST':
        form = PasswordChangeFormPrivate(user=user, data=request.POST)
        if form.is_valid():
            form.save()                       
            messages.add_message (request, messages.INFO, 
                                _('password changed'))
            return HttpResponseRedirect(reverse('profile_view_details'))
    else:
        form = PasswordChangeFormPrivate(user=request.user)

    return render_to_response('profiles/profile_change_password.html',
                              { 'form': form,},
                              context_instance=RequestContext(request)
                             )

这是修改密码的表格

class PasswordChangeFormPrivate(PasswordChangeForm):
    def __init__(self, *args, **kwargs):
        super(PasswordChangeForm, self).__init__(*args, **kwargs)

    def clean_new_password2(self):
        password1 = self.cleaned_data.get('new_password1')
        password2 = self.cleaned_data.get('new_password2')
        if password1 and password2:
            if password1 != password2:
                raise forms.ValidationError(_("The two password fields didn't match."))

        min_len = getattr(settings, "PASSWORD_MINIMUM_LENGHT", 6)
        if len(password1) < min_len:
            raise forms.ValidationError(_("Password too short! minimum length is ")+" [%d]" % min_len)

        return password2

这是网址

url(r'^password/change/$',
    profile_change_password,
    name='profile_change_password'
),

正如您所见,不涉及任何模型,因为密码将在验证时替换“用户”密码字段。将其转换为基于类的视图的任何简单方法?有关系吗?

【问题讨论】:

    标签: django django-views django-class-based-views change-password


    【解决方案1】:

    不需要涉及模型——您可以使用FormView。它看起来像这样:

    from django.core.urlresolvers import reverse
    from django.utils.decorators import method_decorator
    from django.contrib.auth.decorators import login_required
    from django.views.generic.edit import FormView
    
    from myapp.forms import PasswordChangeFormPrivate
    
    class ProfileChangePassword(FormView):
        form_class = PasswordChangeFormPrivate
        success_url = reverse('profile_view_details')
        template_name = 'profiles/profile_change_password.html'
    
        def get_form_kwargs(self):
            kwargs = super(ProfileChangePassword, self).get_form_kwargs()
            kwargs['user'] = self.request.user
            return kwargs
    
        def form_valid(self, form):
            form.save()
            messages.add_message(self.request, messages.INFO, _('profile changed'))
            return super(ProfileChangePassword, self).form_valid(form)
    
        @method_decorator(login_required)
        def dispatch(self, *args, **kwargs):
            return super(ProfileChangePassword, self).dispatch(*args, **kwargs)
    

    我不知道你为什么有

    user = get_object_or_404(User, username__iexact=request.user.username)
    

    无论如何,您都需要登录表单,因此request.user 保证是有效用户。

    【讨论】:

    • Thx:在什么时候使用了以下行? kwargs['user'] = self.request.user
    • get_form_kwargs 在实例化表单时返回传递给表单的关键字参数的字典。你这样做而不是写ProfileChangePassword(user=user)——稍后,当视图创建表单时,它会传递user 参数。
    猜你喜欢
    • 2023-03-06
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多