2011-06-08 64 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