Назначение пользовательского ввода в поле charField в качестве внешнего ключа
Я пытаюсь реализовать регистрационный ключ в форме регистрации, который пользователь должен ввести, чтобы иметь возможность создать учетную запись. В моей модели users у меня есть ключевое поле, которое является внешним ключом модели Key. Отношение выглядит следующим образом
class RegistrationKey(models.Model):
key = models.CharField(max_length=30)
class User(AbstractUser):
...
key = models.ForeignKey(RegistrationKey, on_delete=models.CASCADE, null=True, blank=True)
Я пытался подтвердить ввод следующим образом в представлении
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
key_input = request.POST.get('key')
...
if RegistrationKey.objects.filter(key_input=key).exists() and form.is_valid():
user = form.save(commit=False)
user.key.add('key_input')
...
user.save()
В моей форме я установил поле key как CharField, так как я не могу отображать ключи для пользователя. Это означает, что пользователь вводит строку, но django нужен экземпляр, чтобы сохранить его в базе данных. Я не знаю, как это реализовать. Есть ли способ преобразовать строку в экземпляр или есть лучший способ запросить базу данных, чтобы проверить и увидеть, является ли введенный ключ действительным?
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
if form.is_valid():
key_input = form.cleaned_data['key_input']
registration_key_object = RegistrationKey.objects.get(
key=key_input)
user.key = registration_key_object
user.save()
...
если у вас есть строка(ваш_ключ) и вам нужен объект(RegistrationKey)
просто получите его
reigstration_key_object = RegistrationKey.objects.get(key=your_key)
Существует несколько подходов для реализации этого
Подход 1:
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
key_input = request.POST.get('key')
registration_key = RegistrationKey.objects.filter(key_input=key_input)
if Rregistration_key.exists() and form.is_valid():
registration_key = registration_key.first()
user = form.save(commit=False)
user.key = registration_key
user.save()
Подход 2:
def registerPage(request):
form = MyUserCreationForm()
if request.method == 'POST':
form = MyUserCreationForm(request.POST)
key_input = request.POST.get('key')
if form.is_valid():
try:
registration_key = RegistrationKey.objects.get(key_input=key_input)
except RegistrationKey.DoesNotExist:
pass
# raise your exception here
user = form.save(commit=False)
user.key = registration_key
user.save()