Как инициализировать внешний ключ в форме в Django
<Сообщение об ошибке
[...] raise ValueError(
ValueError: Cannot assign "'phr201'": "RegistrationForm.voucher" must be a "Voucher" instance.
Models
class Voucher(models.Model):
name = models.CharField(max_length=120, null=True, blank=True)
class RegistrationForm(models.Model):
voucher = models.OneToOneField(Voucher, on_delete=models.CASCADE)
full_Name = models.CharField(max_length=200,)
Date_of_birth = models.CharField(max_length=100)
View.py
class RegistrationProcessing(generic.CreateView):
form_class = Registerform
template_name = 'RegistrationProcessing.html'
def form_valid(self, form):
form.instance.voucher = self.request.GET.get('q')
return super().form_valid(form)
def get_context_data(self, **kwargs):
context = super(RegistrationProcessing, self).get_context_data(**kwargs)
query = self.request.GET.get('q', default='')
print(query.id)
context.update({
'job_listing': Voucher.objects.filter(
Q(name__iexact=query)
)
})
return context
Как говорит ошибка Cannot assign "'phr201'": "RegistrationForm.voucher" must be a "Voucher" instance.
Вы пытаетесь присвоить строку отношению OneToOne Вы должны передать экземпляр Voucher вместо передачи строки Вы должны сделать вот так
def form_valid(self, form):
voucher_instance = Voucher.objects.get(name=self.request.GET.get('q'))
form.instance.voucher = voucher_instance
return super().form_valid(form)
Здесь я использую get, поэтому он вызовет исключение, если данный запрос не существует, вы должны обработать его в блоке try except или вы можете использовать другой способ, как это
Voucher.objects.filter(name=self.request.GET.get('q')).first()
или использовать get_object_or_404()