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 ボックスは表示されます。

フォームからそれらを非表示にするにはどうすればよいですか? また、ビュー内からこれらのドロップボックスの値を設定するにはどうすればよいですか? 理想的には、「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 を使用してこの問題を解決できますが、より洗練されたアプローチが必要です。

注: 以前にこれを投稿しようとしましたが、ここにあるほど明確ではなかったと思います: 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 に答える