Yamin Himani
Yamin Himani

Reputation: 77

Trying to extend a base html but not working properly

I have a form that I am trying to access when pressing a button on my navbar. I have a base template file that consists of the code for the navbar and background color and I have another template that has the code for the form. The navbar button seems to work every time I remove the {% extends 'base.html' %} but only the form shows up. I want to be able to extend the base template so the navbar background color and nav bar show up too but this is not working.

code snippet from base.html

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <a class="navbar-brand" href="/">TweetyBird</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarText">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item active">
          <a class="nav-link" href="/search">Search by Tweet <span class="sr-only">(current)</span></a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Twitter Bot</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">To be added</a>
        </li>
      </ul>
    </div>

  </nav>

search.html

% extends 'base.html' %}
{%load static%}

  <body>

    
      <container >  
        <form action="/searchoutput/" method="post">
          {% csrf_token %}
          Input Text:
          <input type="text" name="param" required> <br><br>
          {{data_external}}<br><br>
          {{data}}
          <br><br>
          <input type="submit" value="Check tweet">

          </form>
      </container>


  </body>

snippet from url.py

    path('', views.noreq), #shows the html template for the website 
    path('search/',views.search),
    path('searchoutput/',views.searchoutput),
    

snippet from views.py

def noreq(request):
  #when no request is made the html is rendered 
  return render(request,'base.html')
################The method above is required############################################


def search(request):
  return render(request,'search.html')




      

Upvotes: 0

Views: 1507

Answers (2)

Michael Hawkins
Michael Hawkins

Reputation: 2873

There are a couple of issues here. For one, I noticed you don't have the opening bracket on % extends 'base.html' %} in search.html but I'm not sure if that was just a pasting error here.

Secondly, you have no content blocks. You need to specify where in your base.html the content from extended templates will go. For instance:

example base.html:

   <html>
    <head>
    <title>My Site</title>
    </head>
    <body>
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <a class="navbar-brand" href="/">TweetyBird</a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>
    <div class="collapse navbar-collapse" id="navbarText">
      <ul class="navbar-nav mr-auto">
        <li class="nav-item active">
          <a class="nav-link" href="/search">Search by Tweet <span class="sr-only">(current)</span></a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Twitter Bot</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">To be added</a>
        </li>
      </ul>
    </div>
  </nav>
    {% block content %}
    
    {% endblock %}
    </body>
    </html>

In the template that extends base.html:

{% extends 'base.html' %}
{%load static%}

{% block content %}
<container >  
        <form action="/searchoutput/" method="post">
          {% csrf_token %}
          Input Text:
          <input type="text" name="param" required> <br><br>
          {{data_external}}<br><br>
          {{data}}
          <br><br>
          <input type="submit" value="Check tweet">

          </form>
      </container>
{% endblock %}

More documentation: https://docs.djangoproject.com/en/3.0/ref/templates/language/

Upvotes: 1

Edwin Cruz
Edwin Cruz

Reputation: 517

Alright, you have the right idea but are implementing it a bit wrong let me explain.

base.html

In your base html you want to put everything that every single page will share this normally includes: {% load static %}, <!DOCTYPE html>, <html>, <head>, <body>, <footer>, etc Take a look below for what you base html would sort of look like.

{% load static %}
{% load employee_filters %}
<!DOCTYPE html>
<html lang="en">
    <header>
        Site Header
    </header>
    <body>
        <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
            <a class="navbar-brand" href="/">TweetyBird</a>
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarText">
              <ul class="navbar-nav mr-auto">
                <li class="nav-item active">
                  <a class="nav-link" href="/search">Search by Tweet <span class="sr-only">(current)</span></a>
                </li>
                <li class="nav-item">
                  <a class="nav-link" href="#">Twitter Bot</a>
                </li>
                <li class="nav-item">
                  <a class="nav-link" href="#">To be added</a>
                </li>
              </ul>
            </div>
          </nav>
        {% block content %}{% endblock %}
    </body>
</html>

That {% block content %}{% endblock %} is the key. That is where the code will be placed that it another file extends. So in your search.html you would have what is below:

{% extends 'base.html' %}
{% block content %}
    <form action="/searchoutput/" method="post">
        {% csrf_token %}
        Input Text:
        <input type="text" name="param" required> <br><br>
        {{data_external}}<br><br>
        {{data}}
        <br><br>
        <input type="submit" value="Check tweet">
        
    </form>
{% endblock %}

Think of it this way, you are saying that search.html is extending from base.html and then you are replacing the {% block content %} with whatever you have in that new file.

Upvotes: 1

Related Questions