已解决:嵌套循环中的 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: ( 消息正文 )}, args:[ ]},$_ window); handleLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Context:{linkHref: ( 链接 ),eventType: ( 事件类型 )},args:[$_(event)]},$_ window); handleLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Context:{linkHref: ( 链接 ),eventType: ( 事件类型 )},args:[$_(event)]},$_ window); handleLinkClicked=$_.bindFuncToObjContext({funcName:”handleLinkClicked”,obj Context:{linkHref: ( 链接 ),eventType: ( 事件类型 )},args:[$_(event)]},$_ window);

此代码是使用 Python 编程语言以 Django 编程语言编写的。

第一个代码块定义了一个类别的模型。 该模型有名称和父级。 父类是此类别的子类别的另一个类别。

第二个代码块定义了一个视图,该视图从数据库中获取所有类别并按 id 对它们进行排序。 id 是在创建类别时由数据库自动生成的。

第三个代码块定义了一个模板,该模板循环遍历所有类别并将它们作为列表打印出来。 它还遍历每个类别的所有子项并将它们打印出来。

Django 中的循环

循环是多次执行的代码序列。 Django 有几个内置循环,可用于执行常见任务。

Django 中最常见的循环是 for 循环。 for 循环可让您遍历一系列值,它对于执行诸如计数或遍历数据列表之类的操作非常有用。

您还可以使用 while 循环在条件保持为真时继续执行代码块。 while 循环的工作方式与 for 循环类似,但一旦条件为假,它就会停止执行代码。

嵌套循环

嵌套循环是一种允许您在一组语句中运行一组语句的循环。 当您想多次重复一组代码时,这种类型的循环很有用。

什么是模板孩子

模板子项是用于生成其他模型的 Django 模型。 例如,一个子模板可能用于生成博客文章列表。

相关文章:

发表评论