2

テンプレートに検証コードを挿入するデコレータを作成しています。シナリオは次のとおりです。

@insert_verification
def my_view(request):
    # View code here...
    return render(request, 'myapp/index.html', {"foo": "bar"},
        content_type="application/xhtml+xml")


def insert_verification(func):
    def wrapped(request):
        res = func(request)
        if type(res) == HttpResponse:
            # add a verification code to the response
            # just something like this : res.add({"verification": 'xxxxx'})
            # and varification can fill in the template
        return res
    return wrapped

次のテンプレートを使用します。

{% block main %}
<fieldset>
    <legend>{{ title }}</legend>
    <form method="post"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>

    {% fields_for form %}
    <input type="hidden" value="{{varification}}" >
    <div class="form-actions">
        <input class="btn btn-primary btn-large" type="submit" value="{{ title }}">
    </div>
    </form>
</fieldset>
{% endblock %}

異なる辞書でテンプレートを 2 回レンダリングする必要があるようです。しかし、私はそれを行う方法がわかりません。

4

1 に答える 1

1

より良いアプローチは、コンテキスト プロセッサverificationを実装してコンテキスト変数をテンプレート コンテキストに追加することだと思います。

例えば:

validation_context_processor.py

def add_verification(request):
    #get verification code
    ctx = {'verification': 'xxxxx'}

    #you can also check what path it is like
    #if request.path.contains('/someparticularurl/'):
    #    add verification 

    return ctx

settings.py で、更新します

import django.conf.global_settings as DEFAULT_SETTINGS

TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_SETTINGS.TEMPLATE_CONTEXT_PROCESSORS + (
    'custom_context_processors.add_verification',
      )

RequestContext応答をレンダリングするときに使用する必要があります。

def my_view(request):
    # View code here...
    return render_to_response(request, 'myapp/index.html', {"foo": "bar"},
                 context_instance=RequestContext(request)
                 )
于 2013-08-02T05:23:14.080 に答える