Как генерировать пользовательский идентификатор для определенного типа пользователей при регистрации в django?
models.py
class CustomUser(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)
mobileno = models.IntegerField(blank=True, null=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
customer = models.BooleanField(default=False)
vendor = models.BooleanField(default=False)
id = models.AutoField(primary_key=True, editable=False)
userid= models.CharField(max_length=100, unique=True)
objects = UserManager()
def __str__(self):
return self.email
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.vendor == True and self.is_superuser == False:
if not self.userid:
self.userid = "VEN" + str(self.id + (10 ** 5)) # generating the uid and allocating the value
self.userid.save()
else:
pass
else:
pass
forms.py
class CustomUserCreationForm(UserCreationForm):
"""
A Custom form for creating new users.
"""
class Meta:
model = CustomUser
fields = ['email','first_name','last_name','mobileno']
def save(self, commit=True):
user = super().save(commit=False)
user.customer = True
if commit:
user.save()
return user
""" For Vendor users forms"""
class VendorCreationForm(UserCreationForm):
class Meta:
model = CustomUser
fields = ['email','first_name','last_name','mobileno']
def save(self, commit=True):
user = super().save(commit=False)
user.vendor = True
if commit:
user.save()
return user
views.py
#Vendor Signup
def VendorSignup(request):
vendorform = VendorCreationForm()
if request.method == 'POST':
vendorform = VendorCreationForm(request.POST)
if vendorform.is_valid():
new_user = vendorform.save()
new_user.is_active = False
new_user.save()
return redirect('login')
else:
vendorform = VendorCreationForm()
return render(request, 'vendor/signup.html', {'vendorform': vendorform})
Я хочу генерировать customID (который начинается с VEND0001) для пользователей поставщика только тогда, когда (они зарегистрированы в vendorform) и не должен генерировать customid для клиентов и суперпользователей. У меня возникает ошибка в моделях. Может кто-нибудь, пожалуйста, решить это для меня.
У меня возникли проблемы (UNIQUE constraint failed: customer_customuser.userid).
Возможно, я ошибаюсь, но мне кажется, что когда вы делаете:
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
if self.vendor == True and self.is_superuser == False:
if not self.userid:
self.userid = "VEN" + str(self.id + (10 ** 5)) # generating the uid and allocating the value
self.userid.save()
else:
pass
else:
pass
В super().save нет информации о userid, которая является обязательной.
Возможно, userid= models.CharField(max_length=100, unique=True, null=True)
будет работать... Но учтите, что NULL != NULL.
Затем измените
if not self.userid
на if self.userid is None: