从 django 管理操作中间页面重定向到更改表单页面

Posted

技术标签:

【中文标题】从 django 管理操作中间页面重定向到更改表单页面【英文标题】:redirect from django admin action intermediate page to change form page 【发布时间】:2016-02-05 11:09:20 【问题描述】:

我正在尝试构建一个管理操作“download_selected”,它将下载选定的模型。选择操作后,我重定向到intermediate page,以便用户可以选择下载格式。当用户选择下载格式并单击“下载”时,它会下载文件。但停留在同一个中间页面上。如何将其重定向回更改表单管理页面?我想要的这种重定向类似于 django 'download selected file' 默认管理操作。谢谢。

这是我的代码。

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 %

【问题讨论】:

无法得到您想要的。也许会有所帮助。重定向到管理页面:return HttpResponseRedirect(reverse_lazy('admin:__change', args=[.pk])) 当我做响应重定向时,它返回到更改表单页面但不下载文件。 抱歉,更新了我的问题。希望现在更清楚了。 【参考方案1】:

我添加了一个额外的返回按钮

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

【讨论】:

【参考方案2】:

您需要 javascript 进行重定向。

你可以使用jQuery File Download,这样你就可以做到:

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

不确定是否可以将其与表单帖子结合使用。

【讨论】:

以上是关于从 django 管理操作中间页面重定向到更改表单页面的主要内容,如果未能解决你的问题,请参考以下文章

下载按钮重定向到错误页面

Laravel 在区域设置更改时重定向到路由

开始页面上的 Django 注册表单,没有重定向到登录页面

Django 从表单上传重定向

从 Javascript 接收数据后重定向到新页面

Django 唯一 URL 重定向问题