在 Django 中更改 url
Change url in Django
我正在尝试在 django 中加载数据库中已存在的 pdf 文件。
我可以使用 url、"localhost:8000/documents/file.pdf" 访问 pdf 文件
但是当我执行查询和 return 包含此文件的响应时,url 它重定向到不存在的 "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 class 中使用 FileField
然后你将有资格获得 url 和 file.url 无需重定向即可在任何地方调用,您可以轻松地将其分配给任何按钮。
注意:要跳过你应该使用我上面提到的动作属性form
并在视图方法中渲染它。
编辑:
假设您想从特定对象查看文件(您只需要传递对象的 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)
现在是点击查看上传文件的时候了
template.py
<label for="id_file">Uploaded file: </label>
<a id="id_file" href="{{ query.file.url}}"> {{ query.file.url}}</a>
file.url
是检索文件的确切 url 的魔法。所以当它被点击时,文件将被打开。
从模板文件中的表单标记中删除 action 属性,并将索引函数更改为接近以下内容。
def index(request):
if request.method == "POST":
form = Form(request.POST)
if form.is_valid():
id=request.POST.get("id")
ans = query.objects.get(id=id)
response=ans.repo
if ans is None:
return redirect("index.html")
else:
#return render (request,"ans.html",{'ans':response})
return redirect(response)
else:
form = Form()
return render(request,"index.html",{'form':form})
我没有测试过上面的代码,所以请提供您看到的任何错误的反馈。
我正在尝试在 django 中加载数据库中已存在的 pdf 文件。 我可以使用 url、"localhost:8000/documents/file.pdf" 访问 pdf 文件 但是当我执行查询和 return 包含此文件的响应时,url 它重定向到不存在的 "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 class 中使用 FileField
然后你将有资格获得 url 和 file.url 无需重定向即可在任何地方调用,您可以轻松地将其分配给任何按钮。
注意:要跳过你应该使用我上面提到的动作属性form
并在视图方法中渲染它。
编辑: 假设您想从特定对象查看文件(您只需要传递对象的 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)
现在是点击查看上传文件的时候了 template.py
<label for="id_file">Uploaded file: </label>
<a id="id_file" href="{{ query.file.url}}"> {{ query.file.url}}</a>
file.url
是检索文件的确切 url 的魔法。所以当它被点击时,文件将被打开。
从模板文件中的表单标记中删除 action 属性,并将索引函数更改为接近以下内容。
def index(request):
if request.method == "POST":
form = Form(request.POST)
if form.is_valid():
id=request.POST.get("id")
ans = query.objects.get(id=id)
response=ans.repo
if ans is None:
return redirect("index.html")
else:
#return render (request,"ans.html",{'ans':response})
return redirect(response)
else:
form = Form()
return render(request,"index.html",{'form':form})
我没有测试过上面的代码,所以请提供您看到的任何错误的反馈。