Постоянный slug в Django
В моем веб-приложении Django у каждого пользователя есть случайно сгенерированный токен, созданный для целей, выходящих за рамки данного вопроса.
Это соответствующая модель Profile
models.py
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE,max_length=30)
verified_account = models.BooleanField(default=False)
verify_token = models.SlugField(max_length=15, blank=True, null=True, unique=True)
def __str__(self):
return self.user.username
def get_absolute_url(self):
return reverse('user:profile', kwargs={'pk': self.pk})
def generate_token(self): #important
from django.utils.crypto import get_random_string
self.verify_token = get_random_string(length=15)
return self.verify_token
def save(self, *args, **kwargs): # also important
self.slug = slugify(self.user.username)
self.generate_token() # issue is here
super().save(*args, **kwargs)
So basically, whenever a Profile object is created (on the creation of the User model), a token is randomly generated. However, whenever the Profile
model is updated, so is the verify_token
. Below is the code for my @receiver
that handles user creation
@receiver(post_save, sender=User)
def create_or_update_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
else:
instance.profile.save()
I have tried to insert the following code below the Profile.objects.create(user=instance)
line in order to try and get it to only generate the token when the Profile
is created
Profile.objects.filter(user=instance).generate_token()
Но это дает мне следующую ошибку
'QuerySet' object has no attribute 'generate_token'
Какой лучший способ обеспечить, чтобы slug не изменялся после каждого обновления модели Profile
?
Заранее благодарю за любые решения
Просто добавить поле slug только для чтения? Также, причина, по которой вы получаете ошибку, заключается в том, что .filter() дает вам набор запросов, а не экземпляр.
Profile.objects.filter(user=instance).get().generate_token()
должно работать
Спасибо Ишику Каплану за предоставление основы для моего решения.
В итоге я просто добавил условие в функцию save() - if self.verify_token is None:
Еще раз спасибо!