在 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})

我没有测试过上面的代码,所以请提供您看到的任何错误的反馈。