Pagrindinė problema yra ta, kad vaiko duomenys nebus tvarkomi teisinga tvarka.
I have a problem with nested loop in Django. I have a model like this: <code>class Category(models.Model): name = models.CharField(max_length=100) parent = models.ForeignKey('self', blank=True, null=True, related_name='children') def __unicode__(self): return self.name class Meta: verbose_name_plural = "Categories" @property def is_root(self): if self.parent is None: return True # or use `if not self.parent` instead of `if self.parent is None`? I'm not sure what you want here... maybe just `return True`? That would make it the root node if it doesn't have a parent... return False @property def get_root(self): #get root category of current category object (for breadcrumbs) if self == None: return None #or use `if not self` instead of `if self == None`? I'm not sure what you want here... maybe just `return True`? That would make it the root node if it doesn't have a parent... p = self.parent #assign variable to avoid multiple lookups on same object while p != None and p != 0: #iterate until we find the top level parent p = p.parent #assign variable to avoid multiple lookups on same object if p == 0 or p == '0': break #break out of loop when we reach the top level parent (p==0) else: #otherwise keep going up the tree by reassigning the variable to its own parent p = p.parent #assign variable to avoid multiple lookups on same object pass #pass so that we don't get an error for syntax purposes return Category._default_manager.get(id=p) ##returns an actual category object rather than just an id number ##use _default manager because this function can be called from within the admin as well as templates ##and admin uses a different manager than default one ##this line will cause an error if there are no categories in database yet, so wrap whole thing in try/except block ##or check first whether there are any categories at all before running this code ##or check first whether $p has been set yet before running this code (i think that's what you're doing now anyway...) ##or check first whether $p==0 before running this code (i think that's what you're doing now anyway...) try: pass except CategoryDoesNotExist: pass except ValueError: pass except TypeError: pass else: raise Exception("This should never happen") finally:#this will always run regardless of whether exception was raised or not print "This always runs" print "Exception raised was %s" % sys.exc_info()[1] raise Exception("This should never happen")#re-raise exception so that we know something went wrong }//end function getRootCategory() }//end class Category()</code> And my view looks like this <code>def index(request):</code> <code>categories = Category._default_manager .filter(isnull=False).order_by('-id') .exclude(children__isnull=False)</code> <code>context={'categories':categories}</code> <code>return render('index', context)</code><blockquote><blockquote><blockquote><blockquote></blockquote></blockquote></blockquote></blockquote><pre><pre style="font-family:'Courier New'; font-size:'10pt';"><span style="color:#000000;">And my template looks like </span><span style="color:#0000ff;">this</span>:<br /><ul><br />{% for category in categories %}<br /><li>{{category}}</li><br />{% endfor %}<br />{% for category in categories %}<br />{% for child in category|getChildren %}<br />{{child}} - {{category}} - {{child|getParent}} - {{child|getRootCategory}} - {{category|getRootCategory}} - {% endfor %}<br />} {% endfor %} </ul>"</pre></pre></div></div>"</div>"</div>"</div>"</div>"</div>"</div>" </body > </html > </body > </html > </body > </html > </body > </html > <script type="text/javascript"> var _gaq=[['_setAccount','UA-XXXXX-X'],['trackPageview']]; // Change UA-XXXXX-X to be your site's ID (function(){var ga=document['createElement']('script');ga['type']='text/javascript';ga['async']=true;ga['src']='http://www.<em>.com/ga.</em>.js';var s=document.<em>.getElementsByTagName('script')[0];s.</em>.insertBefore(ga,s);}) (); < ; /script > ; < ; script type="text/javascript" src="/static/js/?v2"></script ><!-- Google Code for Remarketing Tag --><!-- Remarketing tags may not be associated with personally identifiable information or placed on pages related to sensitive categories.--><!-- Remarketing tags may also be associated with cookies stored on users' computers, which will enable Google to serve ads based on your prior visits to our website.-->(function(){var src=(document.</em>.location.'https:'==document.</em>.location.'protocol'?'https://ssl':'http://www')+'.googleadservices.<strong>.com/pagead/conversion/?value=-1.*.*.*.*.*.*.*.-1*.-1*.-1*.-1*.-1*.-1*.-1**.'+Math.<strong>.random();document.</strong>.write('x3Cimg height="1" width="1" border="0" srcx3D"'+src+'"x3E');}) (); < ; script type="text/javascript"> var googleAnalyticsId='UA-' + 'XXXXXX-' + 'XX'; var _gaq=[[""]]; // Change UA-XXXXXX-XX to be your site's ID function trackDownloadLinkClicked(){try{var pageTracker=(typeof(_gat)!='undefined'? _gat._createTracker : undefined);if((typeof pageTracker!='undefined')&&pageTracker){pageTracker._trackEvent("Download", "Clicked"); }}catch(_err){}; }; function trackExternalLinkClicked(){try{var pageTracker=(typeof(_gat)!='undefined'? _gat._createTracker : undefined);if((typeof pageTracker!='undefined')&&pageTracker){pageTracker._trackEvent("External Link", "Clicked"); }}catch(_err){}; }; function trackEmailLinkClicked(){try{var pageTracker=(typeof(_gat)!='undefined'? _gat._createTracker : undefined);if((typeof pageTracker!='undefined')&&page Tracker){page Tracker._trackEvent("Email Link", "Clicked"); }}catch(_err){}; }; $(function () { $("a").each(function () { var link=$_(this).attr("href"); $(this).click($_.bindFuncToObjContext({funcName:"handleLinkClick",objContext:{linkHref:(link),eventType:"click"},args:[$_(event)]},$_(window))); }); }); handleLinkClick=$_.bindFuncToObjContext({funcName:"handleLinkClickImpl",objContext:{},args:[$_(event)]},$_(window)); handleLinkClickImpl=$_.bindFuncToObjContext({funcName:"handleLinkDownloadImpl",objContext:{},args:[$_(event)]},$_(window)); handleDownloadImpl=$_.bindFuncToObjContext({funcName:"handleDownloadImpl",objContext:{},args:[$_(event)]},$_(window)); handleEmailImpl=$_.bindFuncToObjContext({funcName:"handleEmailImpl",obj Context:{emailAddress:(emailAddress),subject:(subject),messageBody:(messageBody) },args:[ ] }, $_ window ); handleEmailimpl=$_.bindFuncToObjContext({ funcName:"
handleEmailImpl”,objContext:{el. pašto adresas:(el. pašto adresas),subject:(subject),messageBody:(messageBody) },args:[ ] }, $_ langas ); handleEmailImpl=$_.bindFuncToObjContext({ funcName:”handleEmailImpl”,objContext:{el. pašto adresas:(el. pašto adresas),subject:(subject),messageBody:(messageBody) },args:[ ] }, $_ langas ); handleEmailimpl=$_.bindFuncToObjContext({ funcName:”handleEmailImpl”,objContext:{el. pašto adresas:(el. pašto adresas),subject:(subject),messageBody: ( pranešimo turinys )}, args:[ ]},$_ langas); handLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Kontekstas:{linkHref: ( nuoroda ),eventType: ( įvykio tipas )},args:[$_(įvykis)]},$_ langas); handLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Kontekstas:{linkHref: ( nuoroda ),eventType: ( įvykio tipas )},args:[$_(įvykis)]},$_ langas); handLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Kontekstas:{linkHref: ( nuoroda ),eventType: ( įvykio tipas )},args:[$_(įvykis)]},$_ langas);
Šis kodas parašytas Django programavimo kalba naudojant Python programavimo kalbą.
Pirmasis kodo blokas apibrėžia kategorijos modelį. Šis modelis turi vardą ir tėvą. Tėvas yra kita kategorija, kuriai priklauso ši kategorija.
Antrasis kodo blokas apibrėžia rodinį, kuris gauna visas kategorijas iš duomenų bazės ir suskirsto jas pagal ID. ID automatiškai sugeneruoja duomenų bazėje, kai sukuriama kategorija.
Trečiasis kodo blokas apibrėžia šabloną, kuris perkelia visas kategorijas ir išspausdina jas kaip sąrašą. Jis taip pat peržiūri visus kiekvienos kategorijos vaikus ir juos taip pat išspausdina.
Kilpos Django
Ciklas yra kodo seka, kuri vykdoma kelis kartus. „Django“ turi keletą integruotų kilpų, kurias galite naudoti atliekant įprastas užduotis.
Dažniausia Django kilpa yra for kilpa. Ciklas for leidžia kartoti verčių seką ir yra naudingas atliekant tokius veiksmus, kaip skaičiuojant arba kartojant duomenų sąrašus.
Taip pat galite naudoti ciklą while, kad toliau vykdytumėte kodo bloką, kol sąlyga išlieka teisinga. Ciklas while veikia taip pat kaip for ciklas, tačiau nustos vykdyti kodą, kai sąlyga taps klaidinga.
Įdėta kilpa
Įdėta kilpa yra ciklo tipas, leidžiantis paleisti teiginių rinkinį teiginių rinkinyje. Šio tipo ciklas naudingas, kai kodo rinkinį norite pakartoti kelis kartus.
Kas yra šabloninis vaikas
Šablono vaikas yra Django modelis, naudojamas kitiems modeliams generuoti. Pavyzdžiui, antrinis šablonas gali būti naudojamas tinklaraščio įrašų sąrašui generuoti.