Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Projeto] Minha Solução

Mexi um pouco no código para usar só um arquivo de base para tudo. Vi que a única diferença entre a tag head da base que já usava e dos arquivos de login e cadastro era que neles usava também o bootstrap, então botei o bootstrap dentro de uma condicional e adicionei usa_bootstrap nas views para indicar quando utilizar ele.

base.html

{% load static %}
<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Alura Space</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600&display=swap" rel="stylesheet">
    <!-- CSS only -->
    <link rel="stylesheet" href="{% static '/styles/style.css' %}">
    {% if usa_bootstrap %}
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
    {% endif %}
</head>

<body>
    {% include 'partials/_menu.html' %}
    {% block content %}{% endblock %}
    {% include 'partials/_footer.html' %}
</body>

</html>

login.html

{% extends 'base.html' %}
{% load static %}
{% block content %}
            <section class="galeria" style="margin-left: 5em">
                <form action="{% url 'login' %}" method="POST">
                    {% csrf_token %}
                    <div class="row">
                        {% for field in form.visible_fields %}
                        <div class="col-12 col-lg-12" style="margin-bottom: 10px;">
                            <label for="{{ field.id_for_label }}" style="color:#D9D9D9; margin-bottom: 5px;">{{field.label}}</label>
                            {{ field }}
                        </div>
                        {% endfor %}
                        <div class="col-12 col-lg-12" style="margin-bottom: 10px;">
                            <button class="btn btn-success col-12" style="padding: top 5px;" type="submit">Logar</button>
                        </div>
                    </div>
                </form>
            </section>
        </main>
    </div>
{% endblock %}

View do index

def index(request):
    if not request.user.is_authenticated:
        messages.error(request, 'Usuário não logado')
        return redirect('login')
    
    fotografias = Fotografia.objects.order_by('-data_fotografia').filter(publicada=True)
    return render(request, 'galeria/index.html', {'cards':fotografias, 'usa_bootstrap':False})

View de Login

def login(request):
    form = LoginForms()

    if request.method == 'POST':
        form = LoginForms(request.POST)

        if form.is_valid():
            nome = form['nome_login'].value()
            senha = form['senha'].value()

            usuario = auth.authenticate(
                request,
                username = nome,
                password = senha
            )

            if usuario is not None:
                auth.login(request, usuario)
                messages.success(request, f'{nome} logado com sucesso!')
                return redirect('index')
            else:
                messages.error(request, 'Usuário não encontrado')
                return redirect('login')

    return render(request, 'usuarios/login.html', {'form':form, 'usa_bootstrap':True})

E como estou usando o base.html para tudo, botei ele na raiz de template: Imagem mostrando a pasta template do projeto, nela base.html está na raiz da pasta, dentro dessa pasta também há uma pasta chamada partials com os arquivos das partials, uma pasta galeria com os templates do app galeria e uma pasta usuarios com os templates do app usuarios.

O meu único problema com a forma que encontrei de resolver essa questão é que dificulta mexer no código no futuro, visto que teria que adicionar o usa_bootstrap em todas as outras views que adicionasse, existe alguma forma de fazer essa mesma coisa mas sem ter que adicionar isso toda vez? uma forma de indicar o django para só usar o bootstrap se o nome do arquivo for login ou cadastro, ou então alguma forma de deixar usa_bootstrap como False por padrão se eu não adicionar ele na view.

1 resposta
solução!

Olá Tiago! Tudo bem?

Para evitar ter que adicionar usa_bootstrap manualmente em cada view, você pode definir um valor padrão para ele no seu template base.html. Se a variável não for passada pela view, o Django não a encontrará e não incluirá o Bootstrap. Para contornar isso, você pode usar a tag {% default %} do Django.

No seu base.html, você pode fazer a seguinte modificação:

{% load static %}
<!DOCTYPE html>
<html lang="pt-br">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Alura Space</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600&display=swap" rel="stylesheet">
    <!-- CSS only -->
    <link rel="stylesheet" href="{% static '/styles/style.css' %}">
    {% if usa_bootstrap|default:False %}
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi" crossorigin="anonymous">
    {% endif %}
</head>

<body>
    {% include 'partials/_menu.html' %}
    {% block content %}{% endblock %}
    {% include 'partials/_footer.html' %}
</body>

</html>

Com essa mudança, o Bootstrap só será incluído se usa_bootstrap for explicitamente passado como True na view. Caso contrário, o valor padrão False será usado.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.