2009-03-20 1 views
3

사용자가 등록 할 수있는 장고 기반 사이트가 있지만 사이트의 특정 부분을보기 전에 관리자가 계정을 승인해야합니다. 나는 그것을 django.contrib.auth에서 벗어나고있다. 사용자가 특정 도메인 이름의 이메일 주소로 등록해야하므로 UserCreationFormsave()clean_email() 방법을 재정의했습니다.장고에서 어떻게이 "등록"보기를 향상시킬 수 있습니까?

내 등록 페이지는 다음보기를 사용합니다. 이 뷰 코드 개선이나 프로세스 개선 (또는 다른 것, 실제로는)을 향상시킬 수있는 방법에 대해 알고 싶습니다.

def register(request): 
    if request.method == 'POST': 
     form = UserCreationForm(request.POST) 

     if form.is_valid(): 
      message = None 

      form.save() 

      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password1'] 

      user = authenticate(username=username, password=password) 

      first_name = form.cleaned_data['first_name'] 
      last_name = form.cleaned_data['last_name'] 
      email = user.email 

      # If valid new user account 
      if (user is not None) and (user.is_active): 
       login(request, user) 
       message = "<strong>Congratulations!</strong> You have been registered." 

       # Send emails 
       try: 
        # Admin email 
        pk = None 
        try: pk = User.objects.filter(username=username)[0].pk 
        except: pass 

        admin_email_template = loader.get_template('accounts/email_notify_admin_of_registration.txt') 
        admin_email_context = Context({ 
         'first_name': first_name, 
         'last_name': last_name, 
         'username': username, 
         'email': email, 
         'pk': pk, 
        }) 
        admin_email_body = admin_email_template.render(admin_email_context) 
        mail_admins("New User Registration", admin_email_body) 

        # User email 
        user_email_template = loader.get_template('accounts/email_registration_success.txt') 
        user_email_context = Context({ 
         'first_name': form.cleaned_data['first_name'], 
         'username': username, 
         'password': password, 
        }) 
        user_email_body = user_email_template.render(user_email_context) 
        user.email_user("Successfully Registered at example.com", user_email_body) 
       except: 
        message = "There was an error sending you the confirmation email. You should still be able to login normally." 
      else: 
       message = "There was an error automatically logging you in. Try <a href=\"/login/\">logging in</a> manually." 

      # Display success page 
      return render_to_response('accounts/register_success.html', { 
        'username': username, 
        'message': message, 
       }, 
       context_instance=RequestContext(request) 
      ) 
    else: # If not POST 
     form = UserCreationForm() 

    return render_to_response('accounts/register.html', { 
      'form': form, 
     }, 
     context_instance=RequestContext(request) 
    ) 

답변

4

당신은이 코드가 필요하지 않습니다,하지만 난 스타일 생각 :

pk = None 
try: pk = User.objects.filter(username=username)[0].pk 
except: pass 

더 자연스럽게 같이 기록됩니다

try: 
    user = User.objects.get(username=username) 
except User.DoesNotExist: 
    user = None 

다음 관리자에 템플릿을 사용 {{ user.id }} 통지 대신을 {{ pk }}.

그러나 내가 말한 것처럼 authenticate()에 대한 호출에서 이미 사용자 개체가 있으므로이 코드가 전혀 필요하지 않습니다.

일반적으로 Python에서는 try/except 블록의 예외 처리기를 비우는 것이 좋지 않은 것으로 간주됩니다. 즉,이 경우에는 항상 User.DoesNotExist과 같은 특정 예외를 캡처하십시오.

try/except 블록의 try 부분에 여러 줄을 포함하는 것이 바람직하지 않습니다. 마지막으로, 작은, 추천 사이트가 무거운 등록 요청을보고 시작하면이 확장되지 않기 때문에보기에 직접 이메일을 보내하지 않는 것입니다

try: 
    ... a line of code that can generate exceptions to be handled ... 
except SomeException: 
    ... handle this particular exception ... 
else: 
    ... the rest of the code to execute if there were no exceptions ... 

:이 방법은 코드를 더 나은 형태이다. django-mailer 응용 프로그램에 다른 프로세스에서 처리하는 대기열로 작업을 오프로드하는 것이 좋습니다.

+0

내 사이트는 많은 트래픽을 보지 못했습니다. 이는 소규모 클럽을위한 것이지만 나머지 제안에 감사드립니다! 그들은 매우 도움이되었다. – Tyson

+1

위와 같이 대답 해 주셔서 감사합니다. 그러나 귀하의 질문은 쉬운 것이 아닙니다 ... 지금 당장 투표를하고 다른 사람들이 대응할 수있는 시간을 더 주길 원할 것입니다. 다른 사람이 더 좋은 대답을 할 수도 있습니다! :) –

0

첫 번째 응답 : "내 코드 개선"질문의 95 % 이상을 훨씬 능가합니다.

특별히 불만을 갖고있는 것이 있습니까?

+0

아무것도 - 난 그냥 내가 놓친 한 가지를 찾고 있어요. 제가 고용하지 않고있는 일들, 일을 할 수있는 기본 방법, 또는 그런 것들. 나는 내가'메시지'를 어떻게 다루는 지 특히 행복하지 않다고 생각한다. 리팩토링해야합니까? – Tyson

3

저는 개인적으로 if-else 문의 첫 번째 분기를 먼저 넣으려고합니다. 특히 돌아 오면. 이것은 어디서 끝나는 지보기 어려운 곳에서 큰 가지를 피하는 것입니다. 많은 사람들이 여러분이 한 것처럼 else 문에 주석을 달았습니다. 그러나 파이썬은 항상 블록 문을 끝내지 않습니다. 폼이 당신에게 유효하지 않은 것처럼 말입니다. 그래서 예를 들면

: 나는 불만이야

def register(request): 
    if request.method != 'POST': 
     form = UserCreationForm() 
     return render_to_response('accounts/register.html', 
           { 'form': form, }, 
           context_instance=RequestContext(request) 
           ) 

    form = UserCreationForm(request.POST) 
    if not form.is_valid(): 
     return render_to_response('accounts/register.html', 
           { 'form': form, }, 
           context_instance=RequestContext(request) 
           ) 
    ...