Как инициализировать внешний ключ в форме в 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()

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