django - 将基于函数的 View 转换为只有表单而没有模型(对象)的基于类的 View

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

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

这是更改密码的 View

@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'
),

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

最佳答案

不需要涉及模型——你可以使用 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保证是有效用户。

关于django - 将基于函数的 View 转换为只有表单而没有模型(对象)的基于类的 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046659/

相关文章:

python - CoreDumpDirectory 不适用于 ubuntu;在 apache2 错误日志中获取段错误

django - 主管启动 celery worker,生成它并以状态码退出(退出状态 1;不是预期的)

django - View 中的多个过滤器参数

python - Ajax 重定向后 Django View 不呈现

python - 如何设置 urls.py 以与 Django 一起使用 app/urls.py 和 src 中的模板

Django CBV - 如何检查用户的自定义属性以允许访问 View

python - 在 Django 中上传后如何获取文件绝对路径?

python - Django 模型表单不保存

django - django如何在基于类的 View 中获取响应

python - Flask 中基于类的(通用) View