Невозможно присвоить "": "" должен быть экземпляром ''

Я пытаюсь сделать ключ регистрации в UserModel, где ключевое поле в форме регистрации является внешним ключом к другой модели под названием RegistrationKey. Я сделал два сообщения на эту тему ранее без какого-либо успеха, однако в моем коде изменилось несколько вещей, которые делают эти предыдущие сообщения неактуальными. В поле формы, поле для ключа является CharField, так как я не могу отображать ключи для пользователей из-за безопасности.

Вот два предыдущих сообщения: Сохранение пользовательского ввода, который является строкой, как объект в db , Textinput с ModelChoiceField

Вот две мои модели.

class RegistrationKey(models.Model):
    key = models.CharField(max_length=30)

    def __str__(self):
        return self.key


class User(AbstractUser):
    key = models.ForeignKey(RegistrationKey, on_delete=models.CASCADE, null=True, blank=True)

После моих последних сообщений я создал представление на основе классов, которое выглядит следующим образом:

class RegisterPage(CreateView):
    form_class = MyUserCreationForm


  def form_valid(self, form):
        key = form.cleaned_data['key']
        try:
            keyobject = RegistrationKey.objects.get(key=key)
            form.instance.key = keyobject
            return super().form_valid(form)
        except RegistrationKey.DoesNotExist:
            form.add_error('key', 'error')
            return super().form_invalid(form)

Когда я пытаюсь передать значение Admin, которое является объектом в модели RegistrationKey, я получаю следующую ошибку: 'Cannot assign "'Admin'": "User.key" должен быть экземпляром "RegistrationKey"'. Я не знаю, как это решить, как можно присвоить эту строку, которую вводит пользователь, базе данных?

Редактировать Вот моя форма

class MyUserCreationForm(UserCreationForm):
    key = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control', 'placeholder':'Key'}), label='')
    email = forms.EmailField(widget=forms.EmailInput(attrs={'class':'form-control', 'placeholder':'Email'}), label='')



    class Meta:
        model = User
        fields = ('key', 'email', 'password1', 'password2')

    
    def __init__(self, *args, **kwargs):
        super(MyUserCreationForm, self).__init__(*args, **kwargs)

        self.fields['password1'].widget.attrs['class'] = 'form-control'
        self.fields['password1'].widget.attrs['placeholder'] = 'Password'
        self.fields['password1'].label=''

        self.fields['password2'].widget.attrs['class'] = 'form-control'
        self.fields['password2'].widget.attrs['placeholder'] = 'Confirm Password'
        self.fields['password2'].label=''
        
        for fieldname in ['password1', 'password2']:
            self.fields[fieldname].help_text = None

Лучше перенести логику получения элемента в форму, где ей и место. Таким образом, с:

from django.core.exceptions import ValidationError

class MyUserCreationForm(UserCreationForm):
    # …

    def clean_key(self):
        key = self.cleaned_data['key']
        try:
            return RegistrationKey.objects.get(key=key)
        except RegistrationKey.DoesNotExist:
            raise ValidationError('The key is not valid.')

Этого должно быть достаточно. Вы не должны переопределять метод .form_valid(…).

Вернуться на верх