2010-08-31 8 views
8

मुझे व्यवस्थापक इंटरफ़ेस के लिए कोई क्रिया बनाने में रूचि है जिसके लिए चयनित वस्तुओं से परे कुछ अतिरिक्त जानकारी की आवश्यकता है। मेरा उदाहरण एक श्रृंखला में कॉमिक्स जोड़ना थोक है। (हां, मुझे पता है कि स्पष्ट जवाब एक्स-टू-एक्स संबंधों के साथ एक स्कीमा बनाना है, लेकिन एक साधारण उदाहरण के लिए मेरे साथ बेकार है)।Django: एक जटिल व्यवस्थापक कार्रवाई कैसे बनाएं जिसके लिए अतिरिक्त जानकारी की आवश्यकता है?

इस उदाहरण में, मैंने 100 कॉमिक्स बनाए हैं। उनके निर्माण के बाद, मैं उन्हें एक श्रृंखला ऑब्जेक्ट से जोड़ना चाहता हूं जो पहले ही बनाया जा चुका है। व्यवस्थापक के भीतर इस क्रिया को निष्पादित करने के लिए, मैं आइटम का चयन करना चाहता हूं फिर कार्रवाई शुरू करें। तब मुझे पूछा जाना चाहिए कि किस श्रृंखला वस्तु का उपयोग करना है (पॉपअप, मध्यवर्ती रूप, आदि के माध्यम से)।

मैंने here निर्देशों का पालन किया है जो इसे मध्यवर्ती रूप के माध्यम से पूरा करने का दावा करते हैं। इसके साथ काम करने के बाद, मुझे और अधिक त्रुटियां नहीं मिल रही हैं, लेकिन कार्रवाई को या तो निष्पादित नहीं किया जा रहा है - फॉलोअप कभी निष्पादित नहीं होता है। इसके बजाए, यह संदेश के साथ कॉमिक्स की व्यवस्थापक सूची में लौटता है: "कोई कार्रवाई नहीं चुनी गई।"

मेरी admin.py विधि:

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' 

मेरे मध्यवर्ती रूप 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> 

उत्तर

5

एक बात मैं देखते हैं कि आपकी कार्रवाई की विधि "का addSeries" है, लेकिन है के रूप में आप इसे "चेंजरीज़" कह रहे हैं।

अपने ModelAdmin में, आप इस तरह की एक पंक्ति होना चाहिए:

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

लिए:

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

actions = ['addSeries'] 

हैं कि लाइन आपके पास है, तो आप को बदलने की जरूरत

इस प्रकार Django के व्यवस्थापक को पता है कि कौन सी कार्रवाई का चयन किया गया था। जब आपके पास कार्रवाई चुनने और कार्रवाई करने के बीच मध्यस्थता है, तो आपको व्यवस्थापक इंटरफ़ेस पर चयन मेनू से कार्रवाई का नाम सुरक्षित रखना होगा।

+0

धन्यवाद! इससे सब कुछ पूरी तरह से काम करता है। – tjw

संबंधित मुद्दे