簡體   English   中英

django子類slug過濾器

[英]django subcategory slug filter

讓我的頭圍繞Django並跟隨探戈與Django書,但最后一個問題在我添加子類別之后得到了我,這個子類別沒有包含在該教程中。

我有以下內容:

models.py
class Category(models.Model):
"""Category"""
name = models.CharField(max_length=50)
slug = models.SlugField()


def save(self, *args, **kwargs):

                    #self.slug = slugify(self.name)
            self.slug = slugify(self.name)
            super(Category, self).save(*args, **kwargs)
def __unicode__(self):
    return self.name


class SubCategory(models.Model):
"""Sub Category"""
category = models.ForeignKey(Category)
name = models.CharField(max_length=50)
slug = models.SlugField()

def save(self, *args, **kwargs):

            self.slug = slugify(self.name)
            super(SubCategory, self).save(*args, **kwargs)

def __unicode__(self):
    return self.name

urls.py
(r'^links/$', 'rango.views.links'),
(r'^links/(?P<category_name_slug>[\w\-]+)/$', 'rango.views.category'),  
(r'^links/(?P<category_name_slug>[\w\-]+)/(?P<subcategory_name_slug>[\w\-]+)/$', 'rango.views.subcategory'),  

views.py
@require_GET
def links(request):
"""Linkdirectory Page"""
category_list = Category.objects.order_by('name')
context_dict = {'categories': category_list}
return render(request, 'links.html', context_dict)

@require_GET
def category(request, category_name_slug):
"""Category Page"""
category = Category.objects.get(slug=category_name_slug)
subcategory_list = SubCategory.objects.filter(category=category)
context_dict = {'subcategories': subcategory_list}
return render(request, 'category.html', context_dict)

@require_GET
def subcategory(request, subcategory_name_slug, category_name_slug):
"""SubCategory Page"""
context_dict = {}
try:
    subcategory = SubCategory.objects.get(slug=subcategory_name_slug)
    context_dict['subcategory_name'] = subcategory.name
    websites = Website.objects.filter(sub_categories=subcategory)
    context_dict['websites'] = websites
    context_dict['subcategory'] = subcategory
except SubCategory.DoesNotExist:
return render(request, 'subcategory.html', context_dict)

這一切都很好,直到我添加具有相同名稱的子類別,例如多個類別的子類別“其他”。

我理解為什么,當我到達“def subategory”時,我的slug將返回多個子類別,所以我需要以某種方式將這些限制到相關類別,比如

"SELECT 
subcategory = SubCategory.objects.get(slug=subcategory_name_slug)
WHERE 
subcategory = SubCategory.objects.filter(category=subcategory)
CLAUSE" 

或者其他的東西 ;)

不確定最佳路線是什么,以及如何過濾這些

鑒於您可能有兩個不同的SubCategory對象具有兩個不同Category對象的相同名稱,如您所建議的那樣,您可以將Category添加為附加過濾器。

按SubCategory.slug和Category.slug過濾

為了達到這個目的,我看到你有一個視圖,它為SubCategory CategoryCategory定義了SubCategory ,你定義的subcategory(request, subcategory_name_slug, category_name_slug)類似於subcategory(request, subcategory_name_slug, category_name_slug) 這些足以過濾:

subcategory = SubCategory.objects.get(
    slug=subcategory_name_slug,
    category__slug=category_name_slug
)
           ^
           |__ # This "double" underscore category__slug is a way to filter
               # a related object (SubCategory.category)
               # So effectively it's like filtering for SubCategory objects where
               # SubCategory.category.slug is category_name_slug

你看上面我使用SubCateogry.objects.get(...)來獲取單個對象而不是`SubCategory.objects.filter(...),它可以返回許多對象。

每個類別強制執行SubCategory.name的唯一性

要使用get()安全地執行此操作,需要保證對於任何給定的類別,將只有一個具有相同名稱的子類別

您可以使用unique_together強制執行此條件

class SubCategory(models.Model):
    class Meta:
        unique_together = (
            ('category', 'name'),          # since slug is based on name,
                                           # we are sure slug will be unique too
        )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM