在Django中隐藏ModelForms中的外键字段

时间:2013-11-14 03:20:53

标签: django django-forms

我正在使用django ModelForms来生成我的输入表单。

我在表单模型中指定仅使用一组字段:

class <Model>Form(ModelForm):
    class Meta:
        model = <Model>
        fields = ('date', 'comment_1')

我的模型定义为:

class <Model>(models.Model):
    fk_id_1 = models.ForeignKey(<ExternalModel1>, null=False, blank=False)
    fk_id_2  = models.ForeignKey(<ExternalModel2>, null=False, blank=False)
    date = models.DateField()
    comment_1 = models.CharField(max_length=100)
    comment_2 = models.CharField(max_length=100)

但是,ForeignKey框显示。

我怎么可能将它们隐藏在表格中?另外,如何在视图中设置这些Dropbox的值并且不确定,从外部说JQuery可以做到吗?理想情况下,在''is_valid()''检查之后,我想设置我的外键的ID,然后进行保存。也许我应该用另一种方式来解决这个问题?

这是视图:

def <Model>_add(request, trainee_id):

    <Model>FormSet = modelformset_factory(<Model>)
    if request.method == 'POST':
        formset = <Model>FormSet(request.POST, request.FILES)
        if formset.is_valid() and formset.has_changed():
            formset.save()
            # do something.
    else:
        formset = <Model>FormSet(queryset=<Model>.objects.none())
    return render_to_response("<Model>_add.html", {
        "formset": formset, "fk_id_1": fk_id_1,
    }, context_instance=RequestContext(request))

我可以使用JQuery解决这个问题,但我想要一个更优雅的方法。

注意:我之前尝试发布此内容,但我认为它不像现在这样明确:Presetting values on a foreign entity relationship in a ModelForm ...我不明白究竟是什么关于QuerySet。

2 个答案:

答案 0 :(得分:2)

您需要更明确地定义表单:

class <Model>Form(ModelForm):
    class Meta:
        model = <Model>
        fields = ['date', 'comment_1']
        exclude = ['fk_id_1', 'fk_id_2']

然后在你看来:

from django.shortcuts import render, redirect

def <Model>_add(request, trainee_id):

    <Model>FormSet = modelformset_factory(<Model>)
    if request.method == 'POST':
        formset = <Model>FormSet(request.POST, request.FILES)
        if formset.is_valid() and formset.has_changed():
            forms = formset.save(commit=False)
            for form in forms:
               form.fk_id_1 = SomeOtherModel.objects.get(pk=1)
               form.fk_id_2 = SomeOtherModel.objects.get(pk=2)
               form.save()
            # add your success redirect here, for example:
            return redirect('/')
    else:
        formset = <Model>FormSet(queryset=<Model>.objects.none())
    return render(request, "<Model>_add.html", {"formset": formset})

答案 1 :(得分:1)

每个ModelForm也有一个save()方法。 doc

或:

在views.py中

form.instance.fk_id_1 = ...
form.instance.fk_id_2 = ...
form.save()