Ges*_*ias 5 python django admin
当我在django admin中保存模型时,我需要一种显示中间页面的方法.
我想要完成的是在"保存"模型之后,显示一个页面,其中列出了模型的所有属性,然后有一个按钮Print.我曾经用点击时用Jquery对话框div来解决这个问题save.这意味着我在实际保存模型之前显示了设置打印视图,但我现在需要首先验证模型.
它就像"删除模型"操作的实现方式一样.我似乎无法找到从哪里开始寻找.
编辑:
从来就开始寻找在django.contrib.admin.options.py对response_change和response_add方法.不知道如何覆盖它们.它只需要一个特定的模型,因此它不是通用的.我还发现了类ModelAdmin中的模板列表.仍然不确定如何在不破坏管理员位的情况下继续进行.
编辑2: 在下面添加了我的工作解决方案.
您可以创建一个表单,为"您确定"步骤进行额外的验证步骤.
在我们的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问题有一个解决方案.
您可以将视图和 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)