如何在基于模型的表单上设置外键的初始值?

时间:2014-02-04 18:42:28

标签: django django-models django-forms django-views

我正在尝试为名为" Customer"的外键设置初始值。在我的基于模型的形式名为" LocationForm"使用form = LocationForm(initial={'customer':Customer.objects.get(id=1)})但表单未通过验证。

我在form.py文件中隐藏了这个带有小部件的输入,因此我测试了启用输入并选择" Customer"在表单中手动并通过验证。当我试图设置初始值时,我做错了什么?

#views.py
def add_location(request):
if request.POST:
    form = LocationForm(request.POST)
    if form.is_valid():
        form.save()
        return HttpResponseRedirect('/django/location')
else:
    form = LocationForm(initial={'customer':Customer.objects.get(id=1)})

return render(request, 'add_location.html', {'form': form})


#forms.py
class LocationForm(forms.ModelForm):

class Meta:
    model = Location
    widgets = {'customer': forms.HiddenInput}


#models.py
class Customer(models.Model):
name = models.CharField(max_length=50)
...

def __unicode__(self):
    return self.name

class Location(models.Model):
customer = models.ForeignKey(Customer)
name = models.CharField(max_length=100)
...

def __unicode__(self):
    return self.name

更新 我弄清楚问题是什么。即使您指定其中一个字段是forms.py中的HiddenInput,您仍然需要在模板中包含表单的标记。我在add_location.html文件中包含以下内容,现在可以使用了:

<div class="fieldWrapper">
    {{ form.customer.errors }}
    {{ form.customer }}
</div>

我应该注意到我正在做一个自定义表单模板而不是通用{{form.as_p}}。如果我这样做了,我相信它会起作用。我认为在进行自定义表单模板时没有实际的理由来进行隐藏输入。

1 个答案:

答案 0 :(得分:0)

您可以从表单中排除hiddenfield并在开始保存对象之前填充该字段:

forms.py

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        exclude = ('customer',)

views.py

def add_location(request):
    if request.POST:
        form = LocationForm(request.POST)
        if form.is_valid():
        entry = form.save(commit=False)
        entry.customer = Customer.objects.get(id=1)
        entry.save()
            return HttpResponseRedirect('/django/location')
    else:
        form = LocationForm()

    return render(request, 'add_location.html', {'form': form})