创建Django Admin Intermediate页面

Ges*_*ias 5 python django admin

当我在django admin中保存模型时,我需要一种显示中间页面的方法.

我想要完成的是在"保存"模型之后,显示一个页面,其中列出了模型的所有属性,然后有一个按钮Print.我曾经用点击时用Jquery对话框div来解决这个问题save.这意味着我在实际保存模型之前显示了设置打印视图,但我现在需要首先验证模型.

它就像"删除模型"操作的实现方式一样.我似乎无法找到从哪里开始寻找.

编辑: 从来就开始寻找在django.contrib.admin.options.pyresponse_changeresponse_add方法.不知道如何覆盖它们.它只需要一个特定的模型,因此它不是通用的.我还发现了类ModelAdmin中的模板列表.仍然不确定如何在不破坏管理员位的情况下继续进行.

编辑2: 在下面添加了我的工作解决方案.

Wil*_*hes 5

您可以创建一个表单,为"您确定"步骤进行额外的验证步骤.

在我们的models.py中给出了这个模型:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

在forms.py中添加表单:

from django import forms
from .models import Person

class PersonForm(forms.ModelForm):
    i_am_sure = forms.BooleanField(required=False, widget=forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        super(PersonForm, self).__init__(*args, **kwargs)

        if self.errors.get('i_am_sure'):
            # show the 'are you sure' checkbox when we want confirmation
            self.fields['i_am_sure'].widget = forms.CheckboxInput()

    def clean(self):
        cleaned_data = super(PersonForm, self).clean()

        if not self.errors:
            # only validate i_am_sure once all other validation has passed
            i_am_sure = cleaned_data.get('i_am_sure')
            if self.instance.id and not i_am_sure:
                self._errors['i_am_sure'] = self.error_class(["Are you sure you want to change this person?"])
                del cleaned_data['i_am_sure']

        return cleaned_data

    class Meta:
        model = Person
Run Code Online (Sandbox Code Playgroud)

如果你想与Django管理员一起使用它.在admin.py中指定此表单:

from django.contrib import admin
from .forms import PersonForm
from .models import Person

class PersonAdmin(admin.ModelAdmin):
    form = PersonForm

admin.site.register(Person, PersonAdmin)
Run Code Online (Sandbox Code Playgroud)

但请注意,Django管理表单上存在隐藏输入的错误.这个Stack Overflow问题有一个解决方案.


Hed*_*ide 2

您可以将视图和 URL 添加到 ModelAdmin 并覆盖 modeladmin 添加视图以进行相应的重定向。

class MyModelAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(MyModelAdmin, self).get_urls()
        my_urls = patterns('',
            (r'^my_view/$', self.my_view)
        )
        return my_urls + urls

    def my_view(self, request):
        # custom view which should return an HttpResponse
        pass
Run Code Online (Sandbox Code Playgroud)