【问题标题】:Change url in Django在 Django 中更改 url
【发布时间】:2026-01-06 21:15:01
【问题描述】:

我正在尝试在 django 中加载一个已存在于数据库中的 pdf 文件。 我可以使用 url 访问 pdf 文件,“localhost:8000/documents/file.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/”。

【问题讨论】:

  • 尝试从表单中删除action 属性并提供反馈。
  • @MiniGunnR 如果我这样做,那么我将如何将请求传递给视图?
  • 创建一个可以唯一呈现此 pdf 的不同视图,在 urls.py 中使用它自己的 path 定义它,然后使用 HttpResponseRedirect('that_new_path')
  • 我不明白你想在你的视图中做什么。你想在某处显示文件还是让别人下载它?
  • @TahseenRahman 在 Django 中使用 if else 来编写显示表单的视图有一定的方法。这不像你以前在 PHP 中所做的那样。我已经看到 action 属性可以在 Django 表单中跳过。请阅读 django 文档中的 Forms

标签: python django python-3.x django-2.1


【解决方案1】:

当您输入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 的动作属性并在视图方法中呈现它。

编辑: 假设您想从特定对象查看文件(您只需要传递对象的 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 的魔法。所以当它被点击时,文件将被打开。

【讨论】:

  • 类查询(models.Model): id=models.IntegerField(primary_key=True) repo=models.FileField(upload_to='documents/') 这是我的models.py文件。我直接通过管理面板上传文件,我希望这样。
  • 我正在使用自定义 HTML 5 模板来执行此操作。完整的代码可以在 www.github.com/tahseen09/delhipatho 找到。我是初学者,如果你能帮助我,我会很感激你。
  • 我得到了我想要的 url,但它显示了一个可疑文件操作错误
  • 我的另一个问题是我可以在表单中使用get方法吗?
  • 是的,你绝对可以在表单中使用 get 方法,但你会从 url 获取参数,然后它们将显示在 url 中
【解决方案2】:

从模板文件中的表单标记中删除 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})

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

【讨论】:

  • 我收到可疑文件操作的错误。
最近更新 更多