【问题标题】:NoReverseMatch error for download file page下载文件页面的 NoReverseMatch 错误
【发布时间】:2020-10-08 09:31:28
【问题描述】:

我正在开发一个 django 网络应用程序。在这里,当提交表单时,Web 应用程序会生成一个 pandas 数据框。此数据框存储在根目录中。我有另一个用于下载生成的 csv 文件的视图。但是当我重定向到下载页面时,我得到一个 No reverse match 错误。

这是我目前的代码

def randomfilename(stringLength=8):
    lettersAndDigits = string.ascii_letters + string.digits
    return ''.join(random.choice(lettersAndDigits) for i in range(stringLength))

def generate_dataframe(request):
    if request.method == 'POST':
        ...
        df = pd.DataFrame(columns=cols)
        df['title'] = title_lst
        df['link'] = product_links[:1]

        fn = randomfilename()
        df.to_csv('./'+fn+'.csv')
        return redirect("download_file", filename = fn)

def download_file(request, filename):
    if request.method == 'POST':

        file_path = './'+filename

        file = open(file_path, 'r')
        mime_type, _ = mimetypes.guess_type(file_path)
        response = HttpResponse(file, content_type=mime_type)
        response['Content-Disposition'] = "attachment; filename=%s" % filename

        return response

项目 urls.py

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('scraper.urls')),
]

scraper urls.py

urlpatterns = [
    path('generate', views.generate_dataframe, name='generate_dataframe'),
    path('download/<filename>/', views.download_file, name='download_file'),
]

我知道我在某处弄乱了 URL。但我不确定如何纠正这个问题。请帮我。提前致谢。

【问题讨论】:

    标签: python django django-views django-urls django-url-reverse


    【解决方案1】:

    试试这个:

    在你看来

    from django.urls import reverse
    
    def generate_dataframe(request):
        ...
    return redirect(reverse('download_file', kwargs={'filename': fn}))
    

    在你的 urls.py 中:

    urlpatterns = [
        ...
        path('download/<str:filename>/', views.download_file, name='download_file'),
    ]
    

    在您的模板中:

    {% url 'download_file' filename %}
    

    【讨论】:

    • 我仍然收到此错误Reverse for 'download_file' with no arguments not found. 1 pattern(s) tried: ['download/(?P&lt;filename&gt;[^/]+)/$']
    • 您的 urls.py 是在您的基础应用中还是在其他应用中?
    • 项目只包含项目文件夹和app文件夹。项目中只有一个应用程序。应用名称是刮板。问题中的 URL 位于 app 文件夹中。我还编辑了问题以添加项目 URL。请看一下
    • 在您的 urls.py 中在 urlsparterns app_name='scraper' 之前添加一个变量。然后在你看来,做:return redirect(reverse('scraper:download_file', kwargs={'filename': fn}))
    • 我试过了。它没有帮助。我为应用程序 URL 添加了另一个路径,例如 path('download/', views.download_file, name='download_file'),,这样当它是 get request 时,显示网页,当按下按钮时,下载文件。现在我得到一个不同的错误download_file() missing 1 required positional argument: 'filename' 。我做的对吗?
    猜你喜欢
    • 2021-05-01
    • 2011-03-25
    • 2016-10-13
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多