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