4

现在,这是密码在用户配置文件中的更改方式。知道没有涉及模型的情况下,将其转换为基于类的视图的最佳方式是什么?将基于功能的视图转换为仅基于视图的基于类的视图(对象)

这是更改密码

@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

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

正如你看到没有模型的形式因为密码将在验证时替换“用户”密码字段。任何将此转换为基于类的视图的简单方法?有关系吗?

回答

4

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

+0

Thx:在什么时候使用下面的行? kwargs ['user'] = self.request.user – un33k 2012-01-28 20:02:24

+0

'get_form_kwargs'返回实例化时传递给表单的关键字参数的字典。你这样做而不是写'ProfileChangePassword(user = user)' - 稍后,当视图创建表单时,它会传递'user'参数。 – 2012-01-28 20:11:17

+0

很好的解释,谢谢。 – un33k 2012-02-01 02:35:45

相关问题