4

初心者の質問で申し訳ありませんが...

誰かが inlineformset_factory の使用例を明らかにすることはできますか?

私はDjangoのドキュメントの例に従いました:

#Models
class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    author = models.ForeignKey(Author)
    title = models.CharField(max_length=100)

#View

def jojo(request):

    BookFormSet = inlineformset_factory(Author, Book)
    author = Author.objects.get(name=u'Mike Royko')
    formset = BookFormSet(instance=author)


    return render_to_response('jojo.html', {
        'formset': formset,
    })

#jojo.html
<form action="" method="POST">
<table>

{{ formset }}

</table>
<input type="submit" value="Submit" />
</form>

ただし、ブック フィールドのみが表示されます。

私の理解では、formset は、Django Admin と同じように、インラインの Author フォームを含む Book フォームを表示するということでした。その上、フォームセットに初期値を簡単に渡すことができませんか?

では、2 つの別々の AuthorForm と BookForm を使用するよりも、どのように優れているのでしょうか?

または、明らかな何かが欠けていますか?

4

3 に答える 3

3

inlineformset_factory は、ネストされた要素に対して複数のフォームを提供するだけです。メイン モデルのフォームが必要な場合は、上部に別のフォームが必要です。

以下は、メインフォームが上部に埋め込まれた inlineformset_factory の動作例です。

ビュー.py

from django.shortcuts import get_object_or_404, render_to_response
from django.forms.models import inlineformset_factory
from django.http import HttpResponseRedirect
from django.template import RequestContext

from App_name.models import * #E.g. Main, Nested, MainForm, etc.

. . .

@login_required
def Some_view(request, main_id=None, redirect_notice=None):
    #login stuff . . .
    c = {}
    c.update(csrf(request))
    c.update({'redirect_notice':redirect_notice})#Redirect notice is an optional argument I use to send user certain notifications, unrelated to this inlineformset_factory example, but useful.

    #Intialization --- The start of the view specific functions
    NestedFormset = inlineformset_factory(Main, Nested, can_delete=False, )
    main = None
    if main_id :
        main = Main.objects.get(id=main_id)#get_object_or_404 is also an option

    # Save new/edited Forms
    if request.method == 'POST':
        main_form = MainForm(request.POST, instance=main, prefix='mains')
        formset = NestedFormset(request.POST, request.FILES, instance=main, prefix='nesteds')
        if main_form.is_valid() and formset.is_valid():
            r = main_form.save(commit=False)
            #do stuff, e.g. setting any values excluded in the MainForm
            formset.save()
            r.save()
            return HttpResponseRedirect('/Home_url/')
    else:
        main_form = MainForm(instance=main, prefix='mains') #initial can be used in the MainForm here like normal.
        formset = NestedFormset(instance=main, prefix='nesteds')
    c.update({'main_form':main_form, 'formset':formset, 'realm':realm, 'main_id':main_id})
    return render_to_response('App_name/Main_nesteds.html', c, context_instance=RequestContext(request))

template.html

{% if main_form %}
<form action="." method="POST">{% csrf_token %}
    {{ formset.management_form }}
    <table>
        {{main_form.as_table}}
        {% for form in formset.forms %}
            <table>{{ form }}</table>
        {% endfor %}
    </table>
    <p><input type="submit" name="submit" value="Submit" class="button"></p>
</form>
{% endif %}
于 2012-03-28T20:18:51.360 に答える
2

inlineformset_factory(および)のmodelformset_factory優れた点は、1 つのフォームから複数のモデル インスタンスを作成できることです。単純に「2 つの別々のフォームを使用する」場合、フォームのフィールドの ID が互いに踏みにじられます。

formset_factory 関数は、必要な追加のフォーム (セット) の数を (追加の引数を介して) 認識し、それに応じてフィールドの ID を設定します。

于 2009-12-16T14:03:59.967 に答える
2

inlineformset_factoryフォームのリストを作成します。

これは、ページで同じフォームを繰り返す必要がある場合に使用できます。たとえば、次のようになります。

  • 説明付きの複数の写真をアップロードします。
  • メールで複数のメンバーを招待する
  • 1 時間ごとにカレンダー グリッドを埋める
  • 著者の本のリストを埋めます。

一部の JavaScript コードを使用すると、「別の行を追加」機能も追加できます。

于 2012-06-19T14:01:54.403 に答える