Django管理预览

Django管理预览,django,django-admin,preview,Django,Django Admin,Preview,我需要有“预览”按钮在管理创建/编辑页面。 当用户点击这个按钮时,表单应该被保存并重定向到特定的url,在那个里用户可以看到关于他刚刚添加或编辑的对象的信息 因此,我有一个自定义ModelAdmin类,其中包含我需要的内联表单集: class InboundAdmin(admin.ModelAdmin, ListView): model = Inbound form = InboundForm change_form_template = 'admin/tour/inbo

我需要有“预览”按钮在管理创建/编辑页面。 当用户点击这个按钮时,表单应该被保存并重定向到特定的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\u form.html
。 此模板具有自定义按钮:

<input type="submit" value="{% trans 'Preview' %}" class="default draft-submit" name="_save_as_draft" />
这是
inbound\u草稿
视图:

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')

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

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

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

我找到了一个很好的解决方案,完全解决了我的问题。 您只需重写ModelAdmin类的
save\u model()
response\u change()
response\u 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)
若请求包含
“\u draft”
,那个么我重定向到所需的url,否则它使用默认方法

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

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


仅此而已)

我尝试了这个,但它仍然将我重定向到列表视图。让我澄清一下。您有一个表单和一个
input[type=“button”]
在该表单中。你点击输入,你的页面就会重新加载,对吗?我是说,这是一种非常奇怪的行为。你能试着禁用你的JS,看看有什么变化吗?
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)
<input type="submit" value="{% trans 'Save as a draft' %}" class="default draft-submit" name="_draft" />