2010-08-31 12 views
8

Jestem zainteresowany tworzeniem akcji interfejsu administratora, która wymaga dodatkowych informacji poza wybranymi elementami. Mój przykład to masowe dodawanie komiksów do serii. (Tak, wiem, że oczywistą odpowiedzią jest stworzenie schematu ze związkami X-to-X, ale nagie ze względu na prosty przykład).Django: Jak utworzyć złożoną akcję administratora wymagającą dodatkowych informacji?

W tym przykładzie utworzyłem 100 komiksów. Po ich utworzeniu chciałbym powiązać je z obiektem serii, który został już utworzony. Aby wykonać tę akcję wewnątrz administratora, chciałbym wybrać elementy, a następnie zainicjować akcję. Następnie powinienem zapytać, który obiekt serii użyć (poprzez wyskakujące okienko, formularz pośredni itp.).

Postępowałem zgodnie z instrukcjami here, które roszczą sobie prawo do wykonania tego poprzez formularz pośredni. Po pracy z nim, nie dostaję więcej błędów, ale sama akcja też nie jest wykonywana - forloop nigdy nie zostanie wykonany. Zamiast tego wraca do listy komiksów komiksów z komunikatem: "Nie wybrano żadnej akcji".

mój admin.py metoda:

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' 

Moja pośrednia forma 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> 

Odpowiedz

5

Jedną rzeczą jest fakt, że metoda Twoje działanie jest „addSeries”, ale w formie wy nazywa się to "changeSeries".

W swojej ModelAdmin, trzeba mieć linię:

actions = ['addSeries'] 

Jeśli to linia trzeba, to trzeba zmienić:

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

do:

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

W ten sposób administrator Django wie, która akcja została wybrana. Kiedy masz formularz pośredni pomiędzy wyborem akcji a wykonaniem akcji, musisz zachować nazwę akcji z menu wyboru w interfejsie administratora.

+0

Dziękujemy! Dzięki temu wszystko działało idealnie. – tjw

Powiązane problemy