diff --git a/apps/documents/forms.py b/apps/documents/forms.py
index a0e90c6..92f7f33 100644
--- a/apps/documents/forms.py
+++ b/apps/documents/forms.py
@@ -3,14 +3,24 @@ from pathlib import Path
from django import forms
from apps.scenarios.services import ScenarioNotFound, get_scenario
+from apps.scenarios.services import list_scenarios
SUPPORTED_EXTENSIONS = {".txt", ".md", ".pdf", ".docx"}
class DocumentUploadForm(forms.Form):
- scenario_id = forms.CharField(label="场景")
+ # 使用 ChoiceField 让表单自己维护场景选项,
+ # 这样模板、校验和后续扩展都能围绕一个入口完成。
+ scenario_id = forms.ChoiceField(label="场景", choices=())
file = forms.FileField(label="文件")
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self.fields["scenario_id"].choices = [
+ (scenario["id"], scenario["name"])
+ for scenario in list_scenarios()
+ ]
+
def clean_scenario_id(self):
scenario_id = self.cleaned_data["scenario_id"]
try:
diff --git a/apps/documents/models.py b/apps/documents/models.py
index fd2500e..e111005 100644
--- a/apps/documents/models.py
+++ b/apps/documents/models.py
@@ -2,6 +2,7 @@ from django.db import models
class UploadedDocument(models.Model):
+ # 文档状态用于驱动前端提示和后续可操作项。
STATUS_UPLOADED = "uploaded"
STATUS_INDEXED = "indexed"
STATUS_FAILED = "failed"
@@ -21,3 +22,11 @@ class UploadedDocument(models.Model):
def __str__(self) -> str:
return self.original_name
+
+ def get_status_display_text(self) -> str:
+ """为模板提供更适合演示的中文状态文案。"""
+ return {
+ self.STATUS_UPLOADED: "已上传,待入库",
+ self.STATUS_INDEXED: "已入库,可检索",
+ self.STATUS_FAILED: "入库失败",
+ }.get(self.status, self.status)
diff --git a/apps/documents/views.py b/apps/documents/views.py
index 56fda0a..ee71adf 100644
--- a/apps/documents/views.py
+++ b/apps/documents/views.py
@@ -1,3 +1,4 @@
+from django.contrib import messages
from django.shortcuts import get_object_or_404, redirect, render
from django.views.decorators.http import require_POST
@@ -9,15 +10,18 @@ from .services import create_uploaded_document, index_document
def document_list(request):
+ # 列表页只负责展示文档元数据和可执行操作,不处理入库细节。
documents = UploadedDocument.objects.all()
return render(request, "documents/document_list.html", {"documents": documents})
def upload(request):
+ # 上传成功后仅保存文件和元数据,是否入库由用户显式触发。
if request.method == "POST":
form = DocumentUploadForm(request.POST, request.FILES)
if form.is_valid():
create_uploaded_document(form.cleaned_data["scenario_id"], form.cleaned_data["file"])
+ messages.success(request, "文件已上传,可继续执行入库。")
return redirect("documents:list")
else:
form = DocumentUploadForm()
@@ -31,5 +35,9 @@ def upload(request):
@require_POST
def index(request, document_id: int):
document = get_object_or_404(UploadedDocument, pk=document_id)
- index_document(document)
+ document = index_document(document)
+ if document.status == UploadedDocument.STATUS_INDEXED:
+ messages.success(request, "文档入库成功,当前文档已可参与检索。")
+ else:
+ messages.error(request, "文档入库失败,请检查错误原因后重试。")
return redirect("documents:list")
diff --git a/templates/base.html b/templates/base.html
index 1545237..1f915fc 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -338,6 +338,13 @@
审计日志
+ {% if messages %}
+
+ {% for message in messages %}
+ {{ message }}
+ {% endfor %}
+
+ {% endif %}
{% block content %}{% endblock %}