如何在Django的View中从ForeignKey下拉菜单中初始化值

时间:2019-07-02 11:58:13

标签: python django

在呈现表单时,我需要将我的ForeignKey dropdown =的值设置为url参数。我能够成功将其他表单字段设置为此值,但不能将ForeignKey设置为该值。

我正在尝试使用通过URL传递的reference_id值初始化作为外键的“引用”表单字段。我可以将此值成功分配给表单中的其他三个字段,但不能分配给“引用”。

Models.py

class Manifests(models.Model):

    reference = models.ForeignKey(Orders)
    cases = models.IntegerField()
    description = models.CharField(max_length=1000)
    count = models.IntegerField()

    def __str__(self):
        return self.description

Forms.py

class CreateManifestForm(forms.ModelForm):

    class Meta:
        model = Manifests
        fields = ('reference', 'cases', 'description', 'count')

Views.py

def add_manifest(request, reference_id):

    if request.method == "POST":
        form = CreateManifestForm(request.POST)

        if form.is_valid():
            instance = form.save(commit=False)
            try:
                order = Orders.objects.get(id=reference_id)
            except Orders.DoesNotExist:
                pass
            instance.reference = order
            instance.save()
            return redirect('add_manifest', reference_id=reference_id)

    #this is where my problem is
    form = CreateManifestForm(initial={'reference': reference_id}) 
    reference = request.POST.get('reference')
    manifests = Manifests.objects.all().filter(reference=reference)

    context = {
        'form': form,
        'reference_id': reference_id,
        'manifests' : manifests,
    }

    return render(request, 'add_manifest.html', context)

以防万一:

urls.py

url(r'^add_manifest/(?P<reference_id>\d+)/$', add_manifest, name='add_manifest'),

没有错误,但是该字段未设置为通过URL传递的值。就像我说过的

 form = CreateManifestForm(initial={'cases': reference_id})

然后,cases字段确实具有该值,所以我不确定在外键的情况下如何导航

2 个答案:

答案 0 :(得分:1)

首先在这里了解概念:

class Manifests(models.Model):
    # Though this reference store id from Orders
    # Its actually a Orders object
    reference = models.ForeignKey(Orders)

在Django中,无论何时我们进行外键分配,外对象的主键仅存储在数据库中的当前对象列中,但是当我们在< strong> python代码,它返回整个异物

现在让我们在这里查看您的问题:

form = CreateManifestForm(initial={'reference': reference_id})

在上面的代码中,您正在使用 Integer 对象初始化<{1}}'reference'属性,该对象错误,因为它需要 Orders 对象待分配。

CreateManifestFormCreate

由于“ cases”接受Integer对象,因此上述代码正确运行。

所以解决您的问题的方法是:

通过传递reference_id来查询Orders对象

form = CreateManifestForm(initial={'cases': reference_id})

希望得到帮助!

答案 1 :(得分:0)

查看similar question/answer,您需要在Orders的{​​{1}}字段中设置initial实例,而不仅是相关字段的reference对象。

也许您可以尝试这样的方法,看看是否可行:

id