我正在尝试在 django 中加载数据库中已存在的 pdf 文件。 我可以使用 url“localhost:8000/documents/file.pdf”访问 pdf 文件 但是当我执行查询并返回包含此文件的响应时,它会重定向到不存在的“localhost:8000/ans/documents/file.pdf”。 html代码是:
<form id="signup-form" method="POST" action="ans/">
{% csrf_token %}
<input type="text" name="id" id="id" placeholder="Report id" />
<input type="submit" value="Check" />
</form>
urls.py中的路径是
path('ans/',views.func),
观点是:
def func(request):
if request.method=="POST":
id=request.POST.get("id")
ans = query.objects.get(id=id)
response=ans.repo
if ans is None:
return render(request,"index.html",{})
else:
return redirect(response)
底线是,我不想去掉 url 中的“/ans/”。
请您参考如下方法:
当您放置 ans/ 时,它会将此添加到 url 并在其后添加文件位置。要解决此问题,请删除 ans/ 并提供名称。
path('',views.func, name='func'),
而且,你在观点和形式上都有逻辑错误。您应该使用普通表单或 ModelForm 来获取 id 以形成表单。
def func(request):
if request.method=="POST":
id=request.POST.get("id") # do not get id from url in post method
ans = query.objects.get(id=id)
response=ans.repo
if ans is None:
return render(request,"index.html",{})# do not render index.html just use HttpResponseRedirect. rendering is used for forms.
else:
return redirect(response) # redirecting to the file directly is a bad pattern.
您应该在 models.py 类中使用 FileField 而不是这些糟糕的设计,之后您将有资格在任何地方使用 file.url 调用获取 url 而无需重定向它,并且您可以轻松地将其分配给任何按钮。
注意:要跳过操作属性,您应该使用我在上面提到的 form 并在 View 方法中呈现它。
编辑: 假设您想从特定对象查看文件(您只需要传递对象的 pk,这可以通过 url 模板标记完成)
<a href="{% url 'specific_request' pk=query.pk %}">Specific request</a>
urls.py
path('response/request/<int:pk>/', views.specific_request, name='specific_request')
view.py
def specific_request(request, pk):
query = get_object_or_404(Request,
pk=pk)
context = {
'query': query
}
return render(request,
'view-request-specific.html',
context=context)
现在是时候点击查看上传的文件了 模板.py
<label for="id_file">Uploaded file: </label>
<a id="id_file" href="{{ query.file.url}}"> {{ query.file.url}}</a>
file.url 是检索文件的确切 url 的魔法。所以当它被点击时,文件将被打开。
