Невозможно присвоить "": "" должен быть экземпляром ''
Я пытаюсь сделать ключ регистрации в 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(…).