【问题标题】:Django admin previewDjango 管理员预览
【发布时间】:2016-04-16 21:45:10
【问题描述】:

我需要在管理员创建/编辑页面中有“预览”按钮。 当用户单击此按钮时,应保存表单并重定向到特定的 url,用户可以在其中看到有关他刚刚添加或编辑的对象的信息。

所以我有自定义 ModelAdmin 类,我需要内联表单集:

class InboundAdmin(admin.ModelAdmin, ListView):
    model = Inbound
    form = InboundForm
    change_form_template = 'admin/tour/inbound_form.html'
    inlines = [InboundTourDatesInline, InboundProgramInline, InboundFeedbackInline, InboundMedia,
               InboundTourSliderPhotoInline, InboundPriceDynamicsInline]

模板扩展admin/change_form.html。 此模板有自定义按钮:

<input type="submit" value="{% trans 'Preview' %}" class="default draft-submit" name="_save_as_draft" />

还有这个脚本:

$('.draft-submit').on('click', function(){
                $.ajax({
                    type: "POST",
                    url: "{% url 'tours:inbound_draft' %}",
                    data: $("#{{ opts.model_name }}_form").serialize()
                });
            });

这是inbound_draft 视图:

def draft_inbounds(request):
    print('inbounds')
    form = InboundForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        print('is_valid')
        form.save()
        # Here I should return specific url with pk as an attribute.
    print('not_valid')

问题是,当我单击预览按钮时,它会保存更改,但会将我重定向回管理员中的 list_view。解决我的问题的正确方法是什么?

【问题讨论】:

    标签: django django-admin preview


    【解决方案1】:

    我找到了一个很好的解决方案,可以完全解决我的问题。 您只需要覆盖 ModelAdmin 类的 save_model()response_change()response_add() 方法。 这是我在 admin.py 文件中的课程:

    class InboundAdmin(admin.ModelAdmin, ListView):
        model = Inbound
        form = InboundForm
        change_form_template = 'admin/tour/inbound_form.html'
        inlines = [InboundTourDatesInline, InboundProgramInline, InboundFeedbackInline, InboundMedia,
                   InboundTourSliderPhotoInline, InboundPriceDynamicsInline]
    
    def save_model(self, request, obj, form, change):
        if "_draft" in request.POST:
            obj.published = False  # If it is a draft, then post should not be published
        else:
            obj.published = True
        super(InboundAdmin, self).save_model(request, obj, form, change)
    
    def response_change(self, request, obj):
        if "_draft" in request.POST:
            return HttpResponseRedirect(reverse_lazy("tours:inbound_detail", kwargs={'pk': obj.pk}))
        else:
            return super(InboundAdmin, self).response_change(request, obj)
    
    def response_add(self, request, obj, post_url_continue=None):
        if "_draft" in request.POST:
            return HttpResponseRedirect(reverse_lazy("tours:inbound_detail", kwargs={'pk': obj.pk}))
        else:
            return super(InboundAdmin, self).response_add(request, obj, post_url_continue=None)
    

    如果请求包含"_draft" 然后我重定向到所需的url,否则它使用默认方法。

    在您的模板中,您应该为 savins 添加按钮作为草稿:

    <input type="submit" value="{% trans 'Save as a draft' %}" class="default draft-submit" name="_draft" />
    

    仅此而已)

    【讨论】:

      【解决方案2】:

      当您将按钮设置为submit 输入时,它会提交表单,从而将您重定向到更改列表。要使该按钮“仅限 js”,请更改其类型:

      <input type="button" value="{% trans 'Preview' %}" class="default draft-submit" name="_save_as_draft" />
      

      您也可以阻止通过 JS 提交表单:

      $('.draft-submit').on('click', function(event){
          event.preventDefault();
          // the rest of your code
      });
      

      【讨论】:

      • 我试过了,但它仍然将我重定向到列表视图。
      • 让我澄清一下。您有一个表格和一个input[type="button"] 在该表格内。您单击该输入并重新加载页面,对吗?我的意思是,这是一个真的奇怪的行为。您可以尝试禁用您的 JS 并查看是否有任何变化吗?
      猜你喜欢
      • 1970-01-01
      • 2010-10-12
      • 2018-08-03
      • 1970-01-01
      • 2019-08-22
      • 2017-03-27
      • 2013-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多