Django 未使用查询集正确填充特定表单

Django is not populating correctly an specific form using a 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 值并没有初始化表单,主要是因为我的模型中有非常具体的关系,所以我所做的是创建一个以表单字段为键的字典 (key:value),并且我的模型中的查询集作为值,代码如下:

''' def close_lead(请求): 如果 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 以某种方式找到名字关系?,但也许电池不包括在内。