У меня есть абстрактный класс модели userabstract, который имеет идентификаторы полей (первичный ключ), имя (поле символов) и адрес электронной почты (поле электронной почты). Я наследую этот класс в двух классах пользователя, usertemp. После регистрации я хочу, чтобы данные хранились в usertemp. Когда пользователь нажимает на подтверждающую почту, эти данные будут переданы классу пользователя. Но что происходит, всякий раз, когда кто-то подписывается, модель usertemp обновляется, а не создается новая. То же самое происходит с пользовательским классомDjango перезаписывает существующую модель
Вот код для моделей и представлений
class UserAbstract(models.Model):
id = models.AutoField(db_column='ID', primary_key=True, default=1) # Field name made lowercase.
name = models.CharField(db_column='NAME', max_length=100, default='') # Field name made lowercase.
email = models.CharField(db_column='EMAIL', max_length=100, default='') # Field name made lowercase.
def __str__(self):
return self.name
class Meta:
abstract = True
@python_2_unicode_compatible
class User(UserAbstract):
def __str__(self):
return self.name ;
class Meta:
managed = True
db_table = 'User'
@python_2_unicode_compatible
class Validation(models.Model):
key = models.AutoField(primary_key=True)
key_data = models.CharField(max_length=100, default='')
create_time = models.DateTimeField()
expire_time = models.DateTimeField()
def __str__(self):
return self.key_data
@python_2_unicode_compatible
class UserTemp(UserAbstract):
validation_key = models.ForeignKey(Validation, models.DO_NOTHING, related_name='+', default='') # Field name made lowercase.
verified = models.BooleanField(default=False)
def __str__(self):
return self.validation_key.key_data
views.py
def signup(request):
if request.method == 'POST':
form = FormTemp(request.POST, request.FILES)
if form.is_valid():
primary = form.cleaned_data['email']
try:
qdict = {}
qdict['email'] = primary
user = UserTemp.objects.get(**qdict)
if user.verified==True:
return HttpResponse("Account already exists")
except:
pass
email = form.cleaned_data['email']
signer = hashlib.sha256()
signer.update(primary)
validation_key = signer.hexdigest()
confirm_key = request.build_absolute_uri('/signup-confirm/')+'?key='+validation_key
send_mail('Confirm Your Mail', confirm_key, settings.EMAIL_HOST_USER, [email,])
valid = Validation(key_data=validation_key, create_time=datetime.now(), expire_time=datetime.now()+timedelta(days=30))
valid.save()
argsdict = {}
argsdict['name'] = form.cleaned_data['name']
argsdict['email'] = form.cleaned_data['email']
argsdict['validation_key'] = valid
argsdict['verified'] = False
usertemp = UserTemp(**argsdict)
usertemp.save()
return HttpResponse("Confirmation mail sent")
else:
return HttpResponse('Invalid Data')
else:
return HttpResponse('What are you doing here ? Tresspass')
valid.save() работает нормально, и каждый ключ проверки времени сохраняется, но usertemp содержит только одну модель и является самой последней. Когда я попробовал force_insert=True
, тогда он сказал мне, что дубликат записи существует с тем же самым первичным ключом. Как вы можете видеть, поле первичного ключа id
является AutoField то почему Джанго не создавая новую модель, когда я пишу usertemp = UserTemp(**argsdict)
Это сработало. Большое спасибо, я искал свое решение более двух часов. –