创建Django管理中间页面
我需要一种方法,在我保存了Django管理后台的模型后,显示一个中间页面。
我想要实现的效果是,在“保存”一个模型后,显示一个页面,上面列出这个模型的所有属性,然后有一个按钮,上面写着Print
。我以前是通过点击save
时使用Jquery对话框来解决这个问题。那样的话,我是在实际保存模型之前就显示了设置的打印视图,但现在我需要先验证模型。
这就像“删除模型”这个操作的实现方式一样。不过我就是找不到该从哪里开始。
编辑:
我开始查看django.contrib.admin.options.py
中的response_change
和response_add
方法。不太确定怎么重写它们。而且这只针对一个特定的模型,所以不是通用的。此外,我还发现了Class ModelAdmin中的模板列表。仍然不太确定该如何进行,而不把管理后台搞得一团糟。
编辑 2: 我在下面添加了我的解决方案。
3 个回答
0
所以,经过一段时间的编码,我终于让它工作了。
我的模型管理现在看起来差不多是这样的
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,pk):
from django.shortcuts import render_to_response
from django.template import RequestContext
object = Model.objects.get(pk=pk)
model_dict = model_object.__dict__
return render_to_response('admin/app_name/model/model_view.html',locals(),context_instance=RequestContext(request))
@csrf_protect_m
@transaction.commit_on_success
def add_view(self, request, form_url='', extra_context=None):
"The 'add' admin view for this model."
model = self.model
opts = model._meta
if not self.has_add_permission(request):
raise PermissionDenied
ModelForm = self.get_form(request)
formsets = []
inline_instances = self.get_inline_instances(request)
if request.method == 'POST':
form = ModelForm(request.POST, request.FILES)
if form.is_valid():
new_object = self.save_form(request, form, change=False)
form_validated = True
else:
form_validated = False
new_object = self.model()
prefixes = {}
for FormSet, inline in zip(self.get_formsets(request), inline_instances):
prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1 or not prefix:
prefix = "%s-%s" % (prefix, prefixes[prefix])
formset = FormSet(data=request.POST, files=request.FILES,
instance=new_object,
save_as_new="_saveasnew" in request.POST,
prefix=prefix, queryset=inline.queryset(request))
formsets.append(formset)
if all_valid(formsets) and form_validated:
self.save_model(request, new_object, form, False)
self.save_related(request, form, formsets, False)
self.log_addition(request, new_object)
log.info('The new object has %s id' % new_object.id)
return HttpResponseRedirect('/admin/draws/contest/contest_view/%s' % new_object.id) <-- changed to my new one
.................
.................
我在 templates/admin/app_name/model_view.html
创建了一个 HTML 模板,就这样完成了!
5
你可以创建一个表单,增加一个额外的确认步骤,问用户“你确定吗?”
在我们的 models.py 文件中,可以使用这样的模型:
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=100)
接下来,在 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
如果你想在 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)
不过要注意,Django 后台表单中的隐藏输入有一个bug。在这个 Stack Overflow 问题中有解决方案。
2
你可以在你的 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