3
votes

In a Django template, I want to show different things to authenticated and unauthenticated users.

Specifically, something like the following:

{% if not user.is_authenticated %}
    <div class="margin">
    {{ group.topic }}
    </div>
{% else %}
    {% extends "base.html" %}
    {% load humanize %}
    {% block content %}
    <div class="margin">
        {{ group.topic }}
        <br>
        <b>members:</b>
            {% for member in members %}
            <a href="{% url 'profile' slug=member.username %}">{{ member.username }}</a>,&nbsp;
            {% endfor %}
        <hr size=1>
        <form action="{% url 'private_group_reply' slug=unique %}" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="hidden" id="id_link" name="unique" class="hidden_id" value="{{ unique }}">
            <br>{{ form.image }}<br>
            <br>{{ form.text }}<br>
            <input class="button" type="submit" value="OK" id="id_submit">
        </form>
        {% for reply in replies %}
        {{ reply.writer }}: {{ reply.text }},{{ reply.submitted_on|naturaltime }}<br>
        {% endfor %}

    {% endblock %}
{% endif %}

In other words, I want to extend base.html only for authenticated users, for non-authenticated ones, I want to have a plain template.

I keep getting a TemplateSyntaxError: invalid block tag {% endif %}

How can I accomplish this?

The app in question is a legcy Django app, using Django 1.5.

2
Is this your actual code? - styvane
No, it's a simplification. - Hassan Baig
I think you are missing the closing '%' in the line {% extends "base.html"} - Jorge Zuanon
Oh no, that's a typo from when I wrote it here. Let me correct that. In fact, I'll update the question with an actual code snippet. - Hassan Baig
I think your problem is the extends, why don't you define the extended html in your view and send it via context to your template? - Gocht

2 Answers

4
votes

{% extends var %} must always be the first tag in a template.

You can use an empty template and extend that for your purpose. Try inverting the logic and pulling out the block to the top level:

empty.html

{% block content %}
{% endblock %}

your file.html

{% extends user.is_authenticated|yesno:"base.html,empty.html" %}
    {% load humanize %}
    {% block content %}
    {% if not user.is_authenticated %}
    <div class="margin">
    {{ group.topic }}
    </div>
{% else %}
    <div class="margin">
        {{ group.topic }}
        <br>
        <b>members:</b>
            {% for member in members %}
            <a href="{% url 'profile' slug=member.username %}">{{ member.username }}</a>,&nbsp;
            {% endfor %}
        <hr size=1>
        <form action="{% url 'private_group_reply' slug=unique %}" method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <input type="hidden" id="id_link" name="unique" class="hidden_id" value="{{ unique }}">
            <br>{{ form.image }}<br>
            <br>{{ form.text }}<br>
            <input class="button" type="submit" value="OK" id="id_submit">
        </form>
        {% for reply in replies %}
        {{ reply.writer }}: {{ reply.text }},{{ reply.submitted_on|naturaltime }}<br>
        {% endfor %}
{% endif %}
{% endblock %}
0
votes

I don't think extends could be used inside if block. Maybe you should consider use other way to do this. And it is reasonable, because you better not do logic thing in a template.

Other solutions will be like, for example, render different template file depends on if the user has logged in.