В модели User было поле ключ активации, я убрал его в отдельную модель и теперь никак не соображу, как правильно его сохранить, чтобы можно было активировать пользователя после регистрации.
Не знаю как более точно сформулировать. Джанго подробно изучаю совсем недолго. Код прилагаю
https://dpaste.de/jGVk#модели
class User(AbstractUser):
class Meta:
verbose_name = 'пользователь'
verbose_name_plural = 'пользователи'
phone = models.CharField('номер телефона', max_length=127, blank=True)
# activation_key = models.CharField(max_length=40, blank=True)
# key_expires = models.DateTimeField(default=datetime.date.today())
@models.permalink
def get_absolute_url(self):
return 'user-detail', (self.pk,)
def __str__(self):
name = self.get_full_name()
if not name:
name = self.username
return name
class UserActivationKey(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
activation_key = models.CharField(max_length=40, blank=True)
def __str__(self):
return self.user.username
#вью
def registration_view(request):
form = UserRegistrationForm(request.POST or None)
if form.is_valid():
user = form.save()
create_hash_for_register_email(request, user)
user.save()
send_registration_email(request, user)
return redirect('register-success')
return render(request, 'adverts/registration.html', {'form': form})
def register_confirmation(request, activation_key):
if request.user.is_authenticated():
return redirect('home')
user_check_token = get_object_or_404(UserActivationKey, activation_key=activation_key)
# if user_profile.key_expires < datetime.datetime.now():
# return render_to_response('adverts/registration_link_expired.html')
user = user_check_token
user.is_active = True
user.save()
return render_to_response('adverts/registration_email_confirmed.html')
#утилиты
def create_hash_for_register_email(request, user):
email = request.POST.get('email')
email_utf = email.encode('utf-8')
str_salt_utf = str(random.random()).encode('utf-8')
salt = hashlib.sha1(str_salt_utf).hexdigest()[:5]
salt_utf = salt.encode('utf-8')
user.activation_key = hashlib.sha1(email_utf + salt_utf).hexdigest()
def send_registration_email(request, user):
username = request.POST.get('username')
email = request.POST.get('email')
subject = 'Подтверждение регистрации'
message = "Привет %s, спасибо за регистрацию. Для того чтобы активировать аккаунт," \
" перейдите по этой ссылке: http://127.0.0.1:8010/confirm/%s" % (username, user.activation_key)
send_mail(subject, message, 'ххх@yandex.ru', [email], fail_silently= False)
Спасибо!