Вам даже не нужен этот код, но я думаю, что стиль:
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 / exception. Другими словами, всегда фиксируйте определенное исключение, такое как User.DoesNotExist
для этого случая.
Это также плохая практика - иметь много строк внутри try
части блока 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 , чтобы выгрузить работу в очередь, обрабатываемую другим процессом.