diff --git a/db.sqlite3 b/db.sqlite3 index ff30127..82f93f5 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/links/__pycache__/urls.cpython-312.pyc b/links/__pycache__/urls.cpython-312.pyc index bce1e98..14acbfb 100644 Binary files a/links/__pycache__/urls.cpython-312.pyc and b/links/__pycache__/urls.cpython-312.pyc differ diff --git a/links/__pycache__/views.cpython-312.pyc b/links/__pycache__/views.cpython-312.pyc index 3f32a07..e77f540 100644 Binary files a/links/__pycache__/views.cpython-312.pyc and b/links/__pycache__/views.cpython-312.pyc differ diff --git a/links/search_urls.py b/links/search_urls.py new file mode 100644 index 0000000..a3ce020 --- /dev/null +++ b/links/search_urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.search_aliases, name='search_aliases'), +] diff --git a/links/urls.py b/links/urls.py index f56db38..52d5d25 100644 --- a/links/urls.py +++ b/links/urls.py @@ -7,6 +7,6 @@ urlpatterns = [ path('update//', views.LinkUpdateView.as_view(), name='link_update'), path('delete//', views.LinkDeleteView.as_view(), name='link_delete'), path('delete-selected/', views.delete_selected, name='delete_selected'), - path('/', views.redirect_to_original, name='redirect_to_original'), path('detail//', views.LinkDetailView.as_view(), name='link_detail'), + path('/', views.redirect_to_original, name='redirect_to_original'), ] diff --git a/links/views.py b/links/views.py index b682c49..78f79e4 100644 --- a/links/views.py +++ b/links/views.py @@ -1,7 +1,7 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.views.generic import ListView, CreateView, UpdateView, DeleteView, DetailView -from django.urls import reverse_lazy -from django.db.models import F, Count +from django.urls import reverse_lazy, reverse # Add 'reverse' here +from django.db.models import F, Count, Q from django.db.models.functions import TruncDate from .models import Link, ClickLog from .forms import LinkForm @@ -11,6 +11,7 @@ from django.contrib import messages from django.db import IntegrityError from django.utils.translation import gettext as _ from django.core.exceptions import ValidationError +from django.http import JsonResponse class LinkListView(ListView): model = Link @@ -79,3 +80,32 @@ class LinkDetailView(DetailView): context['click_stats'] = json.dumps(click_stats_list, cls=DjangoJSONEncoder) return context + +def search_aliases(request): + query = request.GET.get('q', '').strip() + print(f"Search query: {query}") # Debug print + + if not query: + return JsonResponse([], safe=False) + + if len(query) == 1: + # For single-letter queries, only match the start of the alias + links = Link.objects.filter(alias__istartswith=query)[:10] + else: + # For longer queries, keep the current behavior + links = Link.objects.filter(Q(alias__icontains=query) | Q(original_url__icontains=query))[:10] + + print(f"Found {links.count()} links") # Debug print + + results = [] + for link in links: + try: + url = request.build_absolute_uri(reverse('redirect_to_original', args=[link.alias])) + results.append({'alias': link.alias, 'url': url}) + print(f"Added result: {link.alias}") # Debug print + except Exception as e: + print(f"Error creating URL for alias {link.alias}: {str(e)}") # Debug print + continue + + print(f"Search results: {results}") # Debug print + return JsonResponse(results, safe=False) diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo index be0e1d8..67b041e 100644 Binary files a/locale/zh_Hans/LC_MESSAGES/django.mo and b/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index 62ffad6..c74f259 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -93,6 +93,9 @@ msgstr "该别名已存在。请选择一个不同的别名。" msgid "Edit Link" msgstr "编辑链接" +msgid "Search aliases..." +msgstr "搜索别名..." + #: 3.12/lib/python3.12/site-packages/django/forms/fields.py:95 msgid "This field is required." msgstr "" diff --git a/templates/base.html b/templates/base.html index 78a5958..e62b126 100644 --- a/templates/base.html +++ b/templates/base.html @@ -32,13 +32,36 @@ border-color: #f5c6cb; color: #721c24; } + .search-results { + position: absolute; + top: 100%; + left: 0; + right: 0; + background-color: white; + border: 1px solid #ddd; + border-top: none; + max-height: 300px; + overflow-y: auto; + display: none; + } + .search-result-item { + padding: 10px; + cursor: pointer; + } + .search-result-item:hover, .search-result-item.active { + background-color: #f8f9fa; + }