Atribuir variáveis ​​ao template filho na tag {% include%} do Django

91

Eu tenho este código (que não me dá o resultado esperado)

#subject_content.html
{% block main-menu %}
    {% include "subject_base.html" %}
{% endblock %}


#subject_base.html
....
....
    <div id="homework" class="tab-section">
        <h2>Homework</h2>
            {% include "subject_file_upload.html" %}
    </div>

modelo filho:

#subject_file_upload.html
    <form action="." method="post" enctype="multipart/form-data">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="submit">
    </form>

e minha visão

#views.py
@login_required
def subject(request,username, subject):
    if request.method == "POST":
        form = CarsForm(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect("/")
    form = CarsForm()
    return render_to_response('subject_content.html', {'form':form}, context_instance=RequestContext(request))

O código acima cria HTML da maneira que eu quero, porém o formulário não atualiza o banco de dados.

MAS,

Se eu pular o modelo do meio e for diretamente para o formulário de upload, funcionará bem:

#subject_content.html
{% block main-menu %}
    {% include "subject_file_upload.html" %}
{% endblock %}

Ajude-me por favor a fazê-lo funcionar com o modelo do meio. Quero fazer isso porque não quero digitar o mesmo código mais de uma vez.

Vor
fonte
13
Você já tentou usar o includecom with?
Besnik

Respostas:

220

Como sugeriu @Besnik, é muito simples:

{% include "subject_file_upload.html" with form=form foo=bar %}

A documentaçãoinclude menciona isso. Ele também menciona que você pode usar onlypara renderizar o modelo apenas com as variáveis ​​fornecidas, sem herdar nenhuma outra variável.

Obrigado @Besnik

Vor
fonte
4
Para completar, observe que se você deseja renderizar o modelo apenas com as variáveis ​​fornecidas (e não herdar o contexto pai), você pode adicionar a opção "apenas": {% include "path / to / template.html" com form = formulário somente}}
gonz
8
Para completar novamente, aqui está o link para "com": docs.djangoproject.com/en/1.8/ref/templates/builtins/#include
Timo
@Vor Se minha visão retornar context["these_items"]e context["other_items"], posso usar incluir com isso para substituir {% for item in these_items %}por {% for item in other_items %}?
GiannisIordanou
por algum motivo, se a variável tiver um _ em seu nome, não funciona. Exemplo: {% include "subject_file_upload.html" with my_form = form foo = bar%}. Alguma explicação para isso?
Alan Tygel