Перенаправить с промежуточной страницы действий администратора django для изменения страницы формы

Я пытаюсь создать действие администратора "download_selected", которое будет загружать выбранные модели. Когда действие выбрано, я перенаправляю на промежуточную страницу, чтобы пользователи могли выбрать формат загрузки. Когда пользователь выбирает формат загрузки и нажимает "загрузить", он загружает файл. Но остается на той же промежуточной странице. Как мне перенаправить его обратно на страницу изменения формы администратора? Это перенаправление, которое я хочу, похоже на действие администратора по умолчанию "загрузить выбранный файл" django. Благодарю.

Вот мой код

admin.py

class SelectDownloadFormatForm(forms.Form):
    DOWNLOAD_TYPE_CHOICES=[('csv','csv'),
                           ('json', 'json'),
                           ('xml','xml')]

    _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
    download_type = forms.ChoiceField(label=_('Select a Download type'), choices=DOWNLOAD_TYPE_CHOICES, widget=forms.RadioSelect())


def download_selected(self, request, queryset):
    import csv
    from django.http import HttpResponse, HttpResponseRedirect
    import StringIO

    form = None

    if 'download' in request.POST:
        form = self.SelectDownloadFormatForm(request.POST)

        if form.is_valid():
            dtype = form.cleaned_data['download_type']
            print dtype
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename="export.csv"'
            writer = csv.writer(response)
            writer.writerow(['id', 'name', 'qid' ,'label', 'name', 'field'])

            count = 0
            for s in queryset:
                questions_query = ParentModel.objects.filter(parent_form_id = s.id)
                for q in questions_query:
                    writer.writerow([s.id, s.name, q.id, q.label, q.name, q.field])
                    count += 1

            plural = ''
            if count != 1:
                plural = 's'

            self.message_user(request, "Successfully downloaded %d survey response%s in %s format" % (count, plural, dtype))               
            return response

    if not form:
        form = self.SelectDownloadFormatForm(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)})

    return render(request,'admin/download_type.html', {'items': queryset,
                                                     'download_type_form': form,
                                                    })
download_selected.short_description = "Download selected forms"

download_type.html

{% extends "admin/base_site.html" %}
{% block content %}
<form action="" method="post">
  {% csrf_token %}  
  {{ download_type_form }}

  <p>Following survey will be downloaded with corresponding responses:</p>

  <ul>{{ items|unordered_list }}</ul>

  <input type="hidden" name="action" value="download_selected" />
  <input type="submit" name="download" value="Download" />
 </form>

{% endblock %}

2 ответа

Решение

Я добавил дополнительную кнопку, чтобы вернуться

<a href="#" onclick="window.history.back(); return false;" class="button cancel-link">Go Back</a>

Вам понадобится JavaScript для перенаправления.

Вы можете использовать jQuery File Download, так что вы можете сделать:

$.fileDownload('/url/to/download').done(function {
        // redirect
})

Не уверен, что вы можете объединить это с формой сообщения.

Другие вопросы по тегам