Skip to main content
 首页 » 编程设计

python之在 Django 中更改 url

2024年12月31日20java哥

我正在尝试在 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 的魔法。所以当它被点击时,文件将被打开。