2010-08-31 6 views
8

Ich bin daran interessiert, eine Aktion für die Admin-Oberfläche zu erstellen, die zusätzliche Informationen benötigt, die über die ausgewählten Elemente hinausgehen. Mein Beispiel ist Massen-Hinzufügen von Comics zu einer Serie. (Ja, ich weiß, dass die offensichtliche Antwort darin besteht, ein Schema mit X-zu-X-Beziehungen zu erstellen, aber nur um eines einfachen Beispiels willen).Django: Wie erstellt man eine komplexe Admin-Aktion, die zusätzliche Informationen benötigt?

In diesem Beispiel habe ich 100 Comics erstellt. Nachdem sie erstellt wurden, möchte ich sie mit einem bereits erstellten Serienobjekt verknüpfen. Um diese Aktion innerhalb des Administrators auszuführen, möchte ich die Elemente auswählen und dann die Aktion initiieren. Ich sollte dann gefragt werden, welches Serienobjekt zu verwenden ist (über ein Popup, Zwischenformular usw.).

Ich habe die Anweisungen here befolgt, die behaupten, dies über eine Zwischenform zu erreichen. Nachdem ich damit gearbeitet habe, bekomme ich keine weiteren Fehler mehr, aber die Aktion selbst wird auch nicht ausgeführt - der Forloop wird nie ausgeführt. Stattdessen kehrt es zur Admin-Liste von Comics mit der Nachricht zurück: "Keine Aktion ausgewählt."

meine admin.py Methode:

from django.shortcuts import render_to_response 
from django.template import RequestContext 
from django.http import HttpResponseRedirect 
def addSeries(self, request, queryset): 
    form = None 
    if 'cancel' in request.POST: 
     self.message_user(request, 'Canceled series linking.') 
     return 
    elif 'link_series' in request.POST: 
     form = self.SeriesForm(request.POST) 
     if form.is_valid(): 
      series = form.cleaned_data['series'] 
      for x in queryset: 
       y = Link(series = series, comic = x) 
       y.save() 
      self.message_user(request, self.categorySuccess.render(Context({'count':queryset.count(), 'series':series}))) 
      return HttpResponseRedirect(request.get_full_path()) 
    if not form: 
     form = self.SeriesForm(initial={'_selected_action': request.POST.getlist(admin.ACTION_CHECKBOX_NAME)}) 
    return render_to_response('setSeries.html', {'comics': queryset, 'form': form, 'path':request.get_full_path()}, context_instance=RequestContext(request)) 
addSeries.short_description = 'Set Series' 

Meine Zwischenform setSeries.html:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>Create Series Links</title> 
    </head> 
    <body> 
     <h1>Create Series Links</h1> 
     <p>Choose the series for the selected comic(s):</p> 
     <form method="post" action="{{ path }}"> 
      <table> 
       {{ form }} 
      </table> 
      <p> 
       <input type="hidden" name="action" value="changeSeries" /> 
       <input type="submit" name="cancel" value="Cancel" /> 
       <input type="submit" name="link_series" value="link_series" /> 
      </p> 
     </form> 
     <h2>This categorization will affect the following:</h2> 
     <ul> 
      {% for comic in comics %} 
       <li>{{ comic.title }}</li> 
      {% endfor %} 
     </ul> 
    </body> 
</html> 

Antwort

5

Eine Sache, ich merke, dass Methode, um Ihre Aktion der ist „addSeries“, aber in der Form, die Sie nenne es "changeSeries".

In Ihrem Modeladmin, sollten Sie eine Zeile wie diese haben:

actions = ['addSeries'] 

Wenn das der Linie ist Sie haben, dann müssen Sie ändern:

<input type="hidden" name="action" value="changeSeries" /> 

zu:

<input type="hidden" name="action" value="addSeries" /> 

So weiß Djangos Administrator, welche Aktion ausgewählt wurde. Wenn Sie zwischen der Auswahl der Aktion und der Ausführung der Aktion ein Zwischenformular haben, müssen Sie den Aktionsnamen aus dem Auswahlmenü auf der Administratoroberfläche beibehalten.

+0

Vielen Dank! Das hat alles perfekt funktionieren lassen. – tjw