0

我正在使用 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 框显示。

我怎么可能从表格中隐藏它们?另外,我如何从视图中设置这些保管箱的值并且不确定,在外部说 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 的确切说法。

4

2 回答 2

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})
于 2013-11-14T05:28:50.530 回答
1

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

或者:

在views.py中

form.instance.fk_id_1 = ...
form.instance.fk_id_2 = ...
form.save()
于 2013-11-14T04:56:02.890 回答