0

複数のページに挿入するフォームを作成したいのですが。以下の例では、テンプレート「form.html」を作成し、「index.html」に入力しようとしました。私はすでにインデックスのビューを持っています(この例では簡略化されています)。したがって、myformビューを呼び出してフォームをインデックスに含める方法がわかりません。

# urls.py
urlpatterns = patterns('',
    url(r'^$', 'index'),
    url(r'^form$', 'myform'),
)

# views.py
def index(request):
    return render(request, 'index.html')

def myform(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            request.session['name'] = form.cleaned_data['name']
            return HttpResponseRedirect('/form')
    else:
        form = MyForm()

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

# form.html
<form action="/form/ok" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

# index.html
....
{% include "form.html" %}
....
4

2 に答える 2

3

{% include %}ingは、テンプレートに追加のhtmlを含める方法です。さまざまな異なるユーザーをルーティングしませんviews

あなたのコードでは、ユーザーが入りindex、与えられindex.htmlます。 index.htmlその後、それ自体{% include %}の内部の内容になりますが、ビューform.htmlとは何の関係もありません。myformテンプレート内でform.htmlは、と呼ばれる変数が必要formです。 formで作成されていないため、このコンテキストでは設定されていませんindex。したがって、フォームのコンテンツはレンダリングされません。form(タグは変数に依存しないためです)。

すべての変数は、使用している範囲内で設定する必要がありviewます。そのため、フォームオブジェクトを作成し、それをすべて。内に渡す必要がありますindex。その時点で、form.html内は期待している変数index.htmlを受け取ります。form

indexフォームを呼び出したくないと判断した場合form(複数のフォームがあるため、より役立つ名前が必要だとします)。その後、できます{% including "form.html" with form=form_variable_from_index %}。これは基本的にフォーム変数の名前を変更しますが、その `{%include%}'dファイル内でのみです。

https://docs.djangoproject.com/en/1.4/ref/templates/builtins/#include

# views.py
def index(request):

    # Need to create the form here
    form = MyForm()

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

def myform(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            request.session['name'] = form.cleaned_data['name']
            return HttpResponseRedirect('/form')
    else:
        form = MyForm()

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

ビューは、参照する1つのテンプレートについて知っています。テンプレートはビューについて何も知りません。あなたがそれらに渡すコンテキスト/変数だけです。

于 2012-09-12T22:15:26.330 に答える
1

これは@rockingskierの答えを拡張したものです。ビューを変更myformして変数を返し、ビューformで呼び出しましたindex

# urls.py
urlpatterns = patterns('',
    url(r'^$', 'index'),
)

# views.py
def myform(request):
    if request.method == "POST":
        form = MyForm(request.POST)
        if form.is_valid():
            request.session['name'] = form.cleaned_data['name']
            return HttpResponseRedirect('/ok')
    else:
        form = MyForm()

    return form

def index(request):
    args['form'] = myform
    return render(request, 'index.html')
于 2012-09-12T23:54:00.010 に答える