Django некорректно заполняет определенную форму, используя Queryset

Я создал две модели Leads и Deals, и я закодировал некоторую логику таким образом, что при нажатии на кнопку Lead становится Deal, так что я хочу, чтобы пользователю была представлена новая форма, но эта форма уже содержит информацию из модели Leads.

@login_required
def close_lead(request):
    if request.method == 'POST':

        deal_form = DealForm(request.POST)

        if deal_form.is_valid():
            deal_form.save()
            messages.success(request, 'You have successfully updated the status from open to Close')
            id = request.GET.get('project_id', '')
            obj = Leads.objects.get(project_id=id)
            obj.status = "Closed"
            obj.save(update_fields=['status'])

            return HttpResponseRedirect(reverse('dashboard'))
        else:
            messages.error(request, 'Error updating your Form')
    else:

        id = request.GET.get('project_id', '')
        obj = get_object_or_404(Leads, project_id=id)
        print(obj.expected_revenue)
        form = NewDealForm(request.POST or None, instance=obj)


    return render(request,
                  "account/close_lead.html",
                  {'form':form})

Я сделал отладку и вывел на консоль набор запросов и информация в порядке, так что набор запросов не является проблемой, проблема в том, что NewForm не заполняет новые значения.

models.py (показаны только 2 модели)

class Leads(models.Model):
    CHOICES = (
                ('Illumination Studies','Illumination Studies'),
                ('Training','Training'),
                ('Survey Design','Survey Design'),
                ('Software License','Software License')
               )
    STATUS = (('Open','Open'),
               ('Closed','Closed'),
               ('Canceled', 'Canceled')
              )
    project_id = models.BigAutoField(primary_key=True)
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    agent = models.ForeignKey(Profile, on_delete=models.CASCADE, default="agent")
    created_at = models.DateTimeField(auto_now_add=True)
    point_of_contact = models.ForeignKey(Client, on_delete=models.CASCADE)
    expected_revenue = MoneyField(max_digits=14, decimal_places=2, default_currency='USD')
    expected_licenses = models.IntegerField(blank=True)
    country = CountryField(blank_label='(select country)')
    status = models.CharField(max_length=10,choices=STATUS)
    estimated_closing_date = models.DateField(blank=True)
    services = models.CharField(max_length=20,choices=CHOICES)


    def __str__(self):
        return f'{self.company}'


class Deal(models.Model):
    project_id = models.ForeignKey(Leads, on_delete=models.CASCADE, default='id')
    agent = models.ForeignKey(Profile, on_delete=models.CASCADE, default="agent")
    service = models.ForeignKey(Leads, on_delete=models.CASCADE, related_name='service')
    closing_date = models.DateField(auto_now_add=True)
    client = models.ForeignKey(Client, on_delete=models.CASCADE,default='client')
    licenses = models.ForeignKey(Leads,on_delete=models.CASCADE, related_name='licenses')
    revenue = MoneyField(max_digits=14, decimal_places=2, default_currency='USD')
    comments = models.TextField(blank=True,null=True)

Может быть, мне нужно наследовать от другой формы?

forms.py (только NewDealForm)

class NewDealForm(forms.ModelForm):
    class Meta:
        model = Deal
        fields = ['agent','client','project_id','service', 'licenses','revenue', 'comments']

Очевидно, что худший сценарий - создать словарь для извлечения данных из набора запросов и затем передать их форме, но я уверен, что Django имеет более элегантный способ обработки этого процесса

Ну, я думаю, иногда Stack Overflow подталкивает вас к решению собственных проблем, это и есть решение.

По сути, значение initial=queryset не инициализировало форму, в основном потому, что у меня очень специфические отношения в моей модели, поэтому я создал словарь (ключ:значение) с полем формы в качестве ключа, и моим queryset из моей модели в качестве значения, код выглядит следующим образом:

''' def close_lead(request): if request.method == 'POST':

    deal_form = DealForm(request.POST)

    if deal_form.is_valid():
        deal_form.save()
        messages.success(request, 'You have successfully updated the status from open to Close')
        id = request.GET.get('project_id', '')
        obj = Leads.objects.get(project_id=id)
        obj.status = "Closed"
        obj.save(update_fields=['status'])

        return HttpResponseRedirect(reverse('dashboard'))
    else:

        messages.error(request, 'Error updating your Form')
else:

    id = request.GET.get('project_id', '')
    obj = get_object_or_404(Leads, project_id=id)

    m = obj.__dict__
    keys = Leads.objects.get(project_id=m['project_id'])

    form_dict = {'project_id':keys.project_id,
                 'agent':keys.agent,
                 'client':keys.point_of_contact,
                 'company':keys.company,
                 'service':keys.services
                 }
    form = NewDealForm(request.POST or None,initial = form_dict)


return render(request,
              "account/close_lead.html",
              {'form':form})

'''

Как вы видите, я создаю словарь объектов, потому что формы разные, поэтому они имеют некоторые общие значения, не все, а затем я просто адаптирую словарь, хорошо и просто, но я почему-то ожидал, что Django как-то находит отношения по имени, но, возможно, батареи для этого не предусмотрены.

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