Django管理预览
我需要有“预览”按钮在管理创建/编辑页面。 当用户点击这个按钮时,表单应该被保存并重定向到特定的url,在那个里用户可以看到关于他刚刚添加或编辑的对象的信息 因此,我有一个自定义ModelAdmin类,其中包含我需要的内联表单集: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
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" />