Django 按属性筛选产品

Django 按属性筛选产品,django,satchmo,Django,Satchmo,我正在使用Satchmo框架开发一个eshop。 有人知道我应该按照什么步骤根据自定义属性(材质类型)过滤产品,以便在页面(material.html)中显示具有相同材质的产品吗? 我应该制作材质视图函数吗 我是否应该重写get_absolute_url函数?当您说“自定义属性”时,您的意思是您已经修改了product.models.product代码以添加另一个字段 如果是这种情况,您可能需要创建一个自定义视图 如果您的产品代码类似于 class Product(models.Model):

我正在使用Satchmo框架开发一个eshop。 有人知道我应该按照什么步骤根据自定义属性(材质类型)过滤产品,以便在页面(material.html)中显示具有相同材质的产品吗? 我应该制作材质视图函数吗 我是否应该重写get_absolute_url函数?

当您说“自定义属性”时,您的意思是您已经修改了
product.models.product
代码以添加另一个字段

如果是这种情况,您可能需要创建一个自定义视图

如果您的产品代码类似于

class Product(models.Model):
    ...
    matieral_type = models.CharField(max_length=128)
    ...
…然后您可以构建这样的视图

def material(request,material_type):
    prods = Product.objects.filter(material_type=material_type)
    return render_to_response('material.html',{'products',prods},RequestContext(request))
当您说“自定义属性”时,您的意思是您修改了
product.models.product
代码以添加另一个字段吗

如果是这种情况,您可能需要创建一个自定义视图

如果您的产品代码类似于

class Product(models.Model):
    ...
    matieral_type = models.CharField(max_length=128)
    ...
…然后您可以构建这样的视图

def material(request,material_type):
    prods = Product.objects.filter(material_type=material_type)
    return render_to_response('material.html',{'products',prods},RequestContext(request))

如果您希望在不接触核心代码的情况下执行此操作,我将在models.py中创建一个本地应用程序localsite/product:

class Material(models.Model):
    product = models.ManyToManyField(Product, blank=True, null=True)
    name = models.CharField(_("Name"), max_length=30)
    slug = models.SlugField(_("Slug"), help_text=_("Used for URLs, auto-generated from name if blank"), blank=True, unique=True)
    description = models.TextField(_("Description"), blank=True, help_text="Optional")
将此新应用添加到您的管理员中,若要在产品页面中提供这些应用,请将其添加为内联:

# if you have lots of products, use the nice horizontal filter from django's admin
class MaterialAdmin(admin.ModelAdmin):
    filter_horizontal = ('product',)

class Material_Inline(admin.TabularInline):
    model = Material.product.through
    extra = 1 

admin.site.register(Material, MaterialAdmin)

# Add material to the inlines (needs: from product.admin import Product, ProductOptions)
ProductOptions.inlines.append(Material_Inline)
admin.site.unregister(Product)
admin.site.register(Product, ProductOptions)
然后,您可以调整视图/URL:

# urls.py
url(r'^material-list/([\w-]+)/$', material_list, {}, name="material_list"),

# view.py
def material_list(request, slug):
    products = Product.objects.filter(material__slug='slug')
    return render_to_response('localsite/material/list.html', {'products':products}, context_instance=RequestContext(request))

如果您希望在不接触核心代码的情况下执行此操作,我将在models.py中创建一个本地应用程序localsite/product:

class Material(models.Model):
    product = models.ManyToManyField(Product, blank=True, null=True)
    name = models.CharField(_("Name"), max_length=30)
    slug = models.SlugField(_("Slug"), help_text=_("Used for URLs, auto-generated from name if blank"), blank=True, unique=True)
    description = models.TextField(_("Description"), blank=True, help_text="Optional")
将此新应用添加到您的管理员中,若要在产品页面中提供这些应用,请将其添加为内联:

# if you have lots of products, use the nice horizontal filter from django's admin
class MaterialAdmin(admin.ModelAdmin):
    filter_horizontal = ('product',)

class Material_Inline(admin.TabularInline):
    model = Material.product.through
    extra = 1 

admin.site.register(Material, MaterialAdmin)

# Add material to the inlines (needs: from product.admin import Product, ProductOptions)
ProductOptions.inlines.append(Material_Inline)
admin.site.unregister(Product)
admin.site.register(Product, ProductOptions)
然后,您可以调整视图/URL:

# urls.py
url(r'^material-list/([\w-]+)/$', material_list, {}, name="material_list"),

# view.py
def material_list(request, slug):
    products = Product.objects.filter(material__slug='slug')
    return render_to_response('localsite/material/list.html', {'products':products}, context_instance=RequestContext(request))

我爱你。我当时正在疯狂定制satchmo,但这个答案在30分钟内就成功了!很高兴这对你有用。是的,在我第一个关于satchmo的项目之后,我发现,在99.99%的情况下,你总能找到一个好的、小的、不触及核心的解决方案。但问题主要在于找到“怎么回事”:-)和“我爱你”。我当时正在疯狂定制satchmo,但这个答案在30分钟内就成功了!很高兴这对你有用。是的,在我第一个关于satchmo的项目之后,我发现,在99.99%的情况下,你总能找到一个好的、小的、不触及核心的解决方案。但问题主要在于找到“怎么回事”:-)