Назначение пользовательского ввода в поле 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()
Вернуться на верх