2013-03-02 117 views
4

我需要一种方式来显示当我在django admin中保存模型时显示的中间页面。创建Django管理中级页面

我想要完成的是在“保存”一个模型后,显示一个模型的所有属性排成一列的页面,然后有一个说明Print的按钮。点击save时,我用Jquery dialog div来解决这个问题。这意味着我在实际保存模型之前展示了设置打印视图,但现在我需要首先验证模型。

它就像执行“删除模型”操作的方式。我似乎无法找到从哪里开始寻找。

编辑: 从来就开始寻找在django.contrib.admin.options.pyresponse_changeresponse_add方法。不知道如何重写它们。它只需要一个特定的模型,所以它不是通用的。我还发现了Class ModelAdmin中的模板列表。仍然不知道如何继续进行管理,而不是黑客入侵。

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

回答

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 
+0

我想我明白你的意思,在我试用后会回来。干杯! – Gesias 2013-03-02 12:19:10

+0

现在就开始工作,谢谢你让我走上正轨!如果有人对此感兴趣,请将代码放在下面。 – Gesias 2013-03-03 08:00:30

0

所以,有点编码后,我得到它的工作。

我的ModelAdmin看起来simular这个现在

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

您可以创建一个表单,其中包含对“您确定”步骤进行验证的额外步骤。如果你想用Django管理使用

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 

鉴于这种模式在我们的models.py:

from django.db import models 

class Person(models.Model): 
    name = models.CharField(max_length=100) 

添加形式forms.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管理形式隐藏输入了一个错误:在您的admin.py指定此形式。 There's a solution to that on this Stack Overflow question