2013-03-02 99 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