Search code examples
bootstrap-4django-templates

bootstrap dropdown appearing to one side


I have template that adds a navbar and uses Bootstrap 4. For a couple of navbar links I have a dropdown. For the first dropdown, under the Admin link. I want the dropdown menu to appear directly below the link. However the dropdown menu is appearing on the left-hand side of the page.

Any ideas to get this to appear below the Admin link?

The template:

<!DOCTYPE html>
{% load static %}
<html>
<head>
  <meta charset="utf-8">
  <title>{% block title %}{% endblock title %}</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  

  <!-- Bootstrap CSS -->
  


<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">

  <!-- Custom CSS -->
  <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}"/>
</head>
 <section class="header">
    <div class="header-top-line bg-primary">
      <div class="container">
        <div class="row">
          <nav class="navbar navbar-expand navbar-dark navbar-short justify-content-between w-100">
            
              <a class="nav-link text-white">
                <span class"text-uppercase"></span>  
              </a>
             
          </nav>
        </div>
      </div>
    </div>
     <div class="header-main bg-white">
       <div class="container">
         <div class="row">
          <nav class="navbar navbar-expand-lg navbar-light bg-light w-100">
            <a class="navbar-brand" href="{% url 'home' %}">{{ cname.company_name }}</a>
            {% if user.is_authenticated %}
              <ul class="navbar-nav mr-auto">
                <li class="nav-item"></li>
              </ul>
            {% endif %}
            <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span>
            </button>
            <div class="collapse navbar-collapse" id="navbarSupportedContent">
                <ul class="navbar-nav ml-auto">
                  <li class="nav-item">
                  {% if perms.accounts.can_add_user %}    
                    <li class="nav-item">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                      Admin
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                      <a class="dropdown-item"
                      href="{% url 'employee_add' %}">Add User</a>
                      <div class="dropdown-divider"></div>
                      <a class="dropdown-item" href="{% url 'admin:index' %}">
                      Admin Panel</a>
                    </div>
                  </li>
                    
                  {% endif %}
                  <li class="nav-item">
                    <a class="nav-link" text="uppercase" data-toggle="none" href="/">
                      Home
                    </a>
                  </li>
                    <a class="nav-link" text="uppercase" data-toggle="none" href="/directory/">
                      Directory
                    </a>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link" text="uppercase" data-toggle="none" href="/documents/">
                      Company Documents
                    </a>
                  </li>
                  <li class="nav-item">
                    <a class="nav-link" text="uppercase" data-toggle="none" href="/projects/">
                      Projects
                    </a>
                  </li>
            {% if user.is_authenticated %}
                  <li class="nav-item">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                      {{ user.username }}
                    </a>
                    <div class="dropdown-menu dropdown-menu-right dropdown-menu-lg-right" aria-labelledby="navbarDropdown">
                      <a class="dropdown-item"
                      href="">Change password</a>
                      <div class="dropdown-divider"></div>
                      <a class="dropdown-item" href="{% url 'account_logout' %}">
                      Log Out</a>
                    </div>
                  </li>
                </ul>
              {% else %}
                <form class="form-inline ml-auto">
                  <a href="{% url 'account_login' %}" class="btn btn-outline-secondary">
                  Log In</a>
                  <a href="{% url 'account_signup' %}" class="btn btn-primary ml-2">
                  Sign up</a>
                </form>
                
              {% endif %}
              <form class="form-inline my-2 pl-2 my-lg-0" method=GET action="{% url 'search_view' %}">
                   
                  <input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" name="q">
                  <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
                </form>
            </div>
          </nav>
          </div>
      </div>
    </div>
  </section>
</html>

Solution

  • Got some help from a knowledgable person. It turns out I needed to add the class of dropdown to the list parent or you don't get a stacking context. eg. <li class="nav-item dropdown">

    I also needed to give each dropdown a unique id and match the ids to the aria-labelledby attribute on the dropdown itself.

    Added to the html:

    <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="adminDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                      Admin
                    </a>