해결됨: 중첩 루프의 django 템플릿 자식 데이터

주요 문제는 하위 데이터가 올바른 순서로 처리되지 않는다는 것입니다.

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 />&lt;ul&gt;<br />{% for category in categories %}<br />&lt;li&gt;{{category}}&lt;/li&gt;<br />{% endfor %}<br /&gt;{% for category in categories %}<br />{% for child in category|getChildren %}<br />{{child}} - {{category}} - {{child|getParent}} - {{child|getRootCategory}} - {{category|getRootCategory}} - {% endfor %}<br /&gt;} {% endfor %} &lt;/ul&gt;"</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);}) (); &lt ; /script &gt ; &lt ; 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');}) (); &lt ; 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 모델입니다. 예를 들어 템플릿 자식을 사용하여 블로그 게시물 목록을 생성할 수 있습니다.

관련 게시물:

코멘트 남김