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:
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.