どのように私はジャンゴで、この「登録」ビューを向上させることができますか?

StackOverflow https://stackoverflow.com/questions/664937

質問

私は、ユーザーが登録することができます(しかし、彼らは、サイトの特定の部分を表示する前にアカウントを承認する管理者が必要です)Djangoのベースのサイトを持っています。私は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)
    )
役に立ちましたか?

解決

あなたも、このコードは必要ありませんが、私はスタイルを考えてます:

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 ...

最後の、マイナー、勧告はあなたのサイトが重い登録要求を確認するために開始した場合、これはスケールしませんので、あなたのビューで直接電子メールを送信しないことです。よりよいキューに作業をオフロードするためにジャンゴ・メーラーのアプリで追加されました別のプロセスによって処理

他のヒント

私は個人的には最初のif-else文の短い枝を入れてみてください。特に、それが返されます。これは、その困難はどこ終わるかを確認するために、大きな枝を取得しないようにします。あなたが行われ、else文でコメントを入れているような多くの他の人が行います。しかし、Pythonのdoesntのは、常にブロック文の終わりを持っている - フォームがあなたのために有効でない場合のように。

ですから、例えばます:

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)
                                 )
    ...

最初の応答:それは、「私のコードを向上させる」の質問の95%よりも優れた多くの一体を探します。

あなたがに不満を持っている特に何かはありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top