【问题标题】:Django : downloading a file (pdf version or odt version) through radio buttonsDjango:通过单选按钮下载文件(pdf版本或odt版本)
【发布时间】:2019-03-22 16:31:52
【问题描述】:

我试图建议我网站的用户通过单选按钮下载 pdf 或 odt 版本的文档。如何获取和使用用户选择的单选按钮的值来提供适当的文件。到目前为止,我一次只能提供一份。

我目前的工作:

models.py

class File(models.Model):
    name = models.CharField(max_length=200)
    pdf_version = models.FileField()
    odt_version = models.FileField()

def __str__(self):
    '''String name represents class File'''
    return self.name

urls.py

path('files_page/', views.files_page, name='files_page'),
path('download_file/<int:file_id>/', views.download_file, name='download_file'),

views.py

def files_page(request):
    files = File.objects.all()
    context = {'files':files}
    return render (request, 'walk/files_page.html', context)


def download_file(request, file_id):
    #No post request; do nothing
    if request.method != 'POST':
        pass
    else:
        #fetch the file to download
        #file = File.objects.get(id=file_id)
        response = FileResponse(open('/home/me/Desktop/super/media_cdn/tog.pdf', 'rb'))
        response['Content-Disposition'] = 'attachment; filename="tog.pdf"'
        return response

模板

{%阻止内容%}

{%for file in files %}
<p>{{file.name}}</p>
<p>{{file.pdf_version}}</p>
<p>{{file.csv_version}}</p>
<form action="{%url 'walk:download_file' file.id%}" method="POST">
{%csrf_token%}
<input type="radio" name="format" value="pdf" checked> pdf
<input type="radio" name="format" value="csv"> csv
<button name="submit">download</button>
</form>
{%endfor%}
{%endblock content%}

【问题讨论】:

    标签: django forms download radio-button


    【解决方案1】:

    让我们从using forms 开始。是的,您在 django 中使用 django 表单,而不是自己重新实现所有内容。

    创建forms.py:

    from django import forms
    
    FILE_FORMAT_CHOICES = [("csv", "Download PDF"), ("csv", "Download CSV")]
    
    class FileFormatForm(forms.Form):
        file_format = forms.ChoiceField(choices=FILE_FORMAT_CHOICES, widget=forms.RadioSelect())
    

    files_page使用的模板内部(让django渲染字段,不要自己做):

    <form action="{%url 'walk:download_file' file.id%}" method="POST">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Download">
    </form>
    

    最后调整views.py

    def files_page(request):
        ...
        context = {
            'files': files,
            'form': FileFormatForm()  # empty / without POST
        }
        ...
    
    
    def download_file(request, file_id):
        assert request.method == 'POST', "users should only come here with POST now"
        form = FileFormatForm(request.POST)  # populate from POST
        if form.data['file_format'] == 'pdf':
            return "return PDF file response here"
        else:
            return "return CSV file response here"
    

    注意:您不要在 Python 中使用 tab。改为使用 4x 空格。

    另一个说明:Class Based Views 进一步减少样板数量。

    【讨论】:

    • if 应该是 'if form.data['file_format']=='pdf':' 而不是 'if form.file_format=='pdf':'。无论如何谢谢你兄弟!
    • @joseph on stackoverflow:你不说“谢谢”,你接受或/和赞成;你没有说“它应该是”,你只是编辑帖子来修复它:]
    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多