Django: загрузка файла (pdf-версия или odt-версия) с помощью переключателей - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь предложить пользователям моего сайта загрузить документ в формате 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

template

{% block content%}

{%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%}

1 Ответ

0 голосов
/ 18 октября 2018

Давайте начнем с , используя формы .Да, вы используете формы 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"

Примечание: вы не используете tab в Python.Вместо этого используйте 4x пробелов.

Другое примечание: Представления на основе классов для дальнейшего уменьшения количества шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...