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>
Dziękujemy! Dzięki temu wszystko działało idealnie. – tjw