Django - 模型方法"保持"旧参数

时间:2017-02-13 12:29:18

标签: python django

我不确定标题是否正确,因为我不太了解发生了什么(但我相信情况似乎如此?)。

我有一个类别模型,它自己有一个ForeignKey(类别)。 我想要做的是获得所有子类别的列表。

示例:食物 - > Fruit,Food.get_subcategories()会给我[Fruit]。

我有一个这样的模型:

class Category(models.Model):
    title = models.CharField(max_length = 100)
    subcategory = models.ForeignKey("self", blank=True, null=True)
    user = models.ForeignKey(User)

    objects = CategoryManager()

    def get_lowest_category(self):
        if self.subcategory:
            return self.subcategory.get_lowest_category()                
        return self

    def get_subcategories(self, out_list=list()):
        if self.subcategory:
            if self.subcategory == self:
                return out_list
            out_list.append(self.subcategory)
            return self.subcategory.get_subcategories(out_list=out_list)
        print(out_list)
        return out_list

相关的观点部分如下:

if "search" in request.POST:
    categories_left = Category.objects.for_title(request.POST["left-search"], user=request.user)
    categories_right = Category.objects.for_title(request.POST["right-search"], user=request.user)
elif "create" in request.POST:
    Category.objects.create(user=request.user, title=request.POST["title"])
elif "add-subcategory" in request.POST:
    left = Category.objects.for_id(request.POST["left-category"], user=request.user)
    right = Category.objects.for_id(request.POST["right-category"], user=request.user)
    try:
        new_category = deepcopy(left)
        new_category.pk = None
        new_category.save()
        Category.objects.filter(id=new_category.id).update(subcategory=right)
    except IntegrityError:
        print("This combination already exists.") # TODO

模板:

<p>Search categories form</p>
<div id="searchboxes">
<form action="/category/" method="post">
    {% csrf_token %}
    <input type="text" name="left-search">
    <select multiple="multiple" id="left-category" name="left-category">
        {% for category in categories_left %}
            <option value="{{ category.id }}">{{ category }}, {{ category.get_subcategories }}</option>
        {% endfor %}
    </select>

    <input type="text" name="right-search">
    <select multiple="multiple" id="right-category" name="right-category">
        {% for category in categories_right %}
            <option value="{{ category.id }}">{{ category }}, {{ category.get_subcategories }}</option>
        {% endfor %}
    </select>
    <input type="submit" name="search" value="Search categories">
    <input type="submit" name="add-subcategory" value="Add subcategory">
</form> 
</div>

我创建了三个类别,然后选择&#34; Food&#34;在左边和&#34; Fruit&#34;在右侧单击&#34;添加子类别&#34;,然后使用空字段搜索以列出两个框中的所有类别, 它看起来像this

When I search again, it looks like this

我用调试器和get_subcategories(self,out_list)函数调用中的out_list检查了前一个调用的列表 - 为什么?

它有一个默认值(list()所以当调用该函数时它应该总是一个空列表,但不知何故上一个调用的列表进入并且我不明白在哪里。

我在管理面板上注册了类别模型并检查了那里的类别,它们是正确的(食物有子类别水果,还有另一个没有子类别的食物类别)。

0 个答案:

没有答案