feat(portfolio): add project search

This commit is contained in:
2026-09-16 17:45:08 +02:00
parent c2e5f9a3a2
commit f0888c4168
4 changed files with 64 additions and 37 deletions
+15 -35
View File
@@ -2,40 +2,20 @@
{% load i18n %}
{% block content %}
<div class="container mt-4">
<div class="row row-deck row-cards">
{% for project in object_list %}
<div class="col-md-4">
{% if project.url %}
<a class="card card-link card-link-pop"
href="{{ project.url }}"
target="_blank">
<div class="card-body">
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
<div>
{% for t in project.tags.all %}
<div class="badge text-white fs-5"
style="background-color: #{{ t.color }}">{{ t }}</div>
{% endfor %}
</div>
</div>
</a>
{% else %}
<div class="card">
<div class="card-body">
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
<div>
{% for t in project.tags.all %}
<div class="badge text-white fs-5"
style="background-color: #{{ t.color }}">{{ t }}</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
</div>
{% endfor %}
</div>
<form class="mb-4">
<div class="form-floating">
<input type="text"
class="form-control"
id="floating-name"
placeholder=""
name="query"
autocomplete="off"
hx-target="#projects"
hx-get="{% url 'projects-query' %}"
hx-trigger="load, input, delay:200ms" />
<label for="floating-name">{% trans "Search" %}</label>
</div>
</form>
<div id="projects"></div>
</div>
{% endblock %}
@@ -0,0 +1,35 @@
<div class="row row-deck row-cards">
{% for project in object_list %}
<div class="col-md-4">
{% if project.url %}
<a class="card card-link card-link-pop"
href="{{ project.url }}"
target="_blank">
<div class="card-body">
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
<div>
{% for t in project.tags.all %}
<div class="badge text-white fs-5"
style="background-color: #{{ t.color }}">{{ t }}</div>
{% endfor %}
</div>
</div>
</a>
{% else %}
<div class="card">
<div class="card-body">
<h4>{{ project.name }}</h4>
<p>{{ project.short_description }}</p>
<div>
{% for t in project.tags.all %}
<div class="badge text-white fs-5"
style="background-color: #{{ t.color }}">{{ t }}</div>
{% endfor %}
</div>
</div>
</div>
{% endif %}
</div>
{% endfor %}
</div>
+1
View File
@@ -5,6 +5,7 @@ from portfolio import views
urlpatterns = [
path("", views.PortfolioView.as_view(), name="portfolio"),
path("projects/", views.ProjectList.as_view(), name="projects"),
path("projects/query/", views.ProjectListQuery.as_view(), name="projects-query"),
path("contact/", views.ContactSend.as_view(), name="contact"),
path("company/<int:pk>/logo/", views.CompanyLogo.as_view(), name="company-logo"),
]
+13 -2
View File
@@ -18,9 +18,8 @@ class PortfolioView(TemplateView):
}
class ProjectList(ListView):
class ProjectList(TemplateView):
template_name = "project_list.html"
model = models.Project
class ContactSend(TemplateView):
@@ -49,3 +48,15 @@ class CompanyLogo(DetailView):
def get(self, request, *args, **kwargs):
company = self.get_object()
return FileResponse(company.logo)
class ProjectListQuery(ListView):
template_name = "project_list_query.html"
model = models.Project
def get_queryset(self):
query = self.request.GET.get("query")
if not query:
return super().get_queryset()
return super().get_queryset().filter(name__contains=query)