주요 문제는 하위 데이터가 올바른 순서로 처리되지 않는다는 것입니다.
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:{emailAddress:(emailAddress),subject:(subject),messageBody:(messageBody) },args:[ ] }, $_ window ); handleEmailImpl=$_.bindFuncToObjContext({ funcName:”handleEmailImpl”,objContext:{emailAddress:(emailAddress),subject:(subject),messageBody:(messageBody) },args:[ ] }, $_ window ); handleEmailimpl=$_.bindFuncToObjContext({ funcName:”handleEmailImpl”,objContext:{emailAddress:(emailAddress),subject:(subject),messageBody: ( message Body )}, args:[ ]},$_ window); handleLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Context:{linkHref: ( 링크 ),eventType: ( 이벤트 유형 )},args:[$_(이벤트)]},$_ window); handleLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Context:{linkHref: ( 링크 ),eventType: ( 이벤트 유형 )},args:[$_(이벤트)]},$_ window); handleLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Context:{linkHref: ( 링크 ),eventType: ( 이벤트 유형 )},args:[$_(이벤트)]},$_ window);
이 코드는 Python 프로그래밍 언어를 사용하여 Django 프로그래밍 언어로 작성되었습니다.
첫 번째 코드 블록은 범주에 대한 모델을 정의합니다. 이 모델에는 이름과 부모가 있습니다. 부모는 이 범주가 자식인 또 다른 범주입니다.
두 번째 코드 블록은 데이터베이스에서 모든 범주를 가져오고 ID별로 정렬하는 뷰를 정의합니다. ID는 카테고리가 생성될 때 데이터베이스에 의해 자동으로 생성됩니다.
세 번째 코드 블록은 모든 범주를 반복하고 목록으로 인쇄하는 템플릿을 정의합니다. 또한 각 범주의 모든 자식을 반복하여 출력합니다.
Django의 루프
루프는 여러 번 실행되는 일련의 코드입니다. Django에는 일반적인 작업을 수행하는 데 사용할 수 있는 몇 가지 기본 제공 루프가 있습니다.
Django에서 가장 일반적인 루프는 for 루프입니다. for 루프를 사용하면 일련의 값을 반복할 수 있으며 데이터 목록을 통해 계산하거나 반복하는 것과 같은 작업을 수행하는 데 유용합니다.
while 루프를 사용하여 조건이 참인 동안 코드 블록을 계속 실행할 수도 있습니다. while 루프는 for 루프처럼 작동하지만 조건이 거짓이 되면 코드 실행을 중지합니다.
중첩 루프
중첩 루프는 문 집합 내에서 문 집합을 실행할 수 있는 루프 유형입니다. 이 유형의 루프는 일련의 코드를 여러 번 반복하려는 경우에 유용합니다.
템플릿 자식이란 무엇입니까?
템플릿 하위는 다른 모델을 생성하는 데 사용되는 Django 모델입니다. 예를 들어 템플릿 자식을 사용하여 블로그 게시물 목록을 생성할 수 있습니다.