2011-06-08 139 views
0

我有'帳戶'視圖,用戶可以在其中更改他的電子郵件,姓名和密碼。要更改他的電子郵件,他必須通過點擊確認鏈接確認他的電子郵件地址。我的視圖代碼看起來很臃腫,我想知道如何改進它並使其更加簡潔。以下是我目前有 -查看電子郵件驗證碼

在模型:

class EmailChangeAuth(models.Model): 
    auth_key = models.CharField(max_length=42) 
    user = models.ForeignKey(User) 
    new_email = models.CharField(max_length=256) 

並在視圖:

@login_required 
def account(request, changed_email=''): 
    old_email = User.objects.get(username=request.user.username).email 
    name_message = password_message = email_message = '' 
    change_name_form = ChangeNameForm(instance=request.user) 
    change_password_form = PasswordChangeForm(user=request.user) 
    change_email_form = ChangeEmailForm(instance=request.user) 
    if request.method == "POST": 
     if "change_name" in request.POST: 
      change_name_form = ChangeNameForm(data=request.POST or None, instance=request.user) 
      if change_name_form.is_valid(): 
       change_name_form.save() 
       name_message = 'Your name has been changed.' 
     if "change_password" in request.POST: 
      change_password_form = PasswordChangeForm(data=request.POST or None, user = request.user) 
      if change_password_form.is_valid(): 
       change_password_form.save()   
       password_message = 'Your password has been changed.'      
     if "change_email" in request.POST: 
      change_email_form = ChangeEmailForm(data=request.POST or None, instance=request.user) 
      if change_email_form.is_valid() and request.POST['email'] != old_email: 
       auth_key = uuid.uuid4() 
       email_auth = EmailChangeAuth(auth_key=auth_key, new_email=request.POST['email'], user=request.user) 
       email_auth.save() 
       subject = "Please confirm your email address" 
       link = "http://127.0.0.1:8000" + reverse('change_email') + str(auth_key) +'/' 
       send_mail(
       'Please confirm your email address', 
       'Please click the following link to confirm your email address: \n \n%s' %(link), 
       settings.DEFAULT_FROM_EMAIL, 
       [request.POST['email']] 
      ) 
       email_message = "Please comfirm your email to complete changes." 

    return render_to_response('userprofile/account.html', 
         { 
         'change_name_form': change_name_form, 
         'old_email': old_email, 
         'change_email_form': change_email_form, 
         'change_password_form': change_password_form, 
         'changed_email': changed_email, 
         'password_message': password_message, 
         'name_message': name_message, 
         'email_message': email_message,}, 
         context_instance=RequestContext(request)) 

def change_email(request, auth_key): 
    try: 
     email_object = EmailChangeAuth.objects.get(auth_key=auth_key) 
     user = email_object.user 
     user.email = email_object.new_email 
     user.save() 
     changed_email = "Your email has been changed." 
     email_object.delete() 
     return account(request, changed_email=changed_email) 
    except EmailChangeAuth.DoesNotExist: 
     return account(request) 

凡將是一個良好的開端,以提高這種大規模的視圖代碼?

+0

'old_email = User.objects.get(username = request.user.username).email' ='old_email = request.user.email' :-) – DrTyrsa 2011-06-08 08:18:54

+0

DrTysa,我確實有'old_email = request.user.email '在某一時刻,但在頁面重新加載它不會保持最新的數據庫中的電子郵件條目。如果我輸入了一個電子郵件地址(即使輸入沒有放入數據庫),它也會改變。出於這個原因,我將其改變爲漫長的路線...我相信有更好的方法來實現這一點,但現在使用longform正在爲我工​​作...... – David542 2011-06-08 08:35:07

回答

5

那麼,你可以先把代碼分成幾個視圖。 類似def change_email(request, user_id):def change_password(request, user_id):等,而不是有一個帳戶視圖。

+0

謝謝。你能舉出一個單一視圖的例子嗎? – David542 2011-06-08 22:21:42