Omar Gonzales
Omar Gonzales

Reputation: 4008

Django: Objects not shown in view when filtering

I've a model called: "Sample", It reference my Sample products. I want to show all my Samples in a page: shop/muestras.html or:

http://127.0.0.1:8000/muestras

This model has a ForeignKey reference to my Category model. I use this field called category to filter all the samples by doing:

c_slug = 'muestras'

muestras = Sample.objects.filter(category__slug=c_slug)

I could also just do:

muestras = Sample.objects.all()

Becuase all my samples have that category 'muestras'. Either way my Samples are not been shown.

However, If I filter my other model Products by it's category's slug 'muestras' all the items with this category are shown:

muestras = Product.objects.filter(category__slug=c_slug)

Just to be sure, I've tested filtering the Sample model in Shell and I'm getting the expected objects:

from shop.models import Sample

samples = Sample.objects.filter(category__slug = 'muestras')
samples
<QuerySet [<Sample: Cinta de embalaje personalizada de muestra>, <Sample: Etiquetas personalizadas de muestra>, <Sample: Imanes personalizados de muestra>, <Sample: Paquete d
e muestra>, <Sample: Stickers personalizados de muestra>]>

What could be wrong?

views.py:

def SamplePackPage(request):
# La categoria es necesaria para mostrar el video de c/categoria

categoria_muestras = Category.objects.get(slug='muestras')

# Productos que pertenecen a la categoria muestras

c_slug = 'muestras'
# muestras = Sample.objects.all()
#
muestras = Sample.objects.filter(category__slug=c_slug)
#
# muestras = Product.objects.filter(category__slug=c_slug)

return render(request, 'shop/muestras.html', {'categoria_muestras': categoria_muestras,
                                              'muestras':muestras})

models.py:

class Category(models.Model):
    name = models.CharField(max_length=250, unique=True)
    slug = models.SlugField(max_length=250, unique=True)
    description = models.TextField(blank=True)
    image = models.ImageField(upload_to='category', blank=True)
    video = EmbedVideoField()

    class Meta:
        ordering = ('name',)
        verbose_name = 'category'
        verbose_name_plural = 'categories'

    def get_url(self):
        return reverse('shop:allCat', args=[self.slug])

    def __str__(self):
        return '{}'.format(self.name)


class Product(models.Model):
    name = models.CharField(max_length=250, unique=True)
    slug = models.SlugField(max_length=250, unique=True)
    description = models.TextField(blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    image = models.ImageField(upload_to='product', blank=True)
    stock = models.IntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'product'
        verbose_name_plural = 'products'

    def get_url(self):
        return reverse('shop:ProdDetail', args=[self.category.slug, self.slug])

    def __str__(self):
        return '{}'.format(self.name)



### Sample Packs ###

class Sample(models.Model):
    name = models.CharField(max_length=250, unique=True)
    slug = models.SlugField(max_length=250, unique=True)
    description = models.TextField(blank=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.IntegerField(default=1)
    image = models.ImageField(upload_to='product', blank=True)
    stock = models.IntegerField()
    available = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('name',)
        verbose_name = 'sample'
        verbose_name_plural = 'samples'

    def get_url(self):
        return reverse('shop:ProdDetail', args=[self.category.slug, self.slug])

    def __str__(self):
        return '{}'.format(self.name)

urls.py:

app_name = 'shop'

urlpatterns = [

    path('admin', admin.site.urls),
    path('', views.allCat, name='allCat'),
    path('<slug:c_slug>', views.ProdCatDetail, name='ProdCatDetail'),
    path('<slug:c_slug>/<slug:product_slug>', views.SamplePack, name='SamplePack'),
    path('muestras', views.SamplePackPage, name='SamplePackPage'),
    path('<slug:c_slug>/<slug:product_slug>/medida-y-cantidad', views.StepOneView.as_view(), name='ProdDetail'),
    path('<slug:c_slug>/<slug:product_slug>/subir-arte', views.StepTwoView.as_view(), name='UploadArt'),
    path('province/', views.get_province, name='province'),
    path('district/', views.get_district, name='district'),
    path('quienes_somos/', views.quienes_somos, name='quienes_somos'),
]

project's urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    # path('', views.index, name = 'index'),
    path('', include('shop.urls')),
    path('cart/', include('cart.urls')),
    path('order/', include('order.urls')),
    path('account/create/', views.signupView, name = 'signup'),
    path('account/login/', views.signinView, name = 'signin'),
    path('account/logout/', views.signoutView, name = 'signout'),
    path('province/', views.get_province, name = 'province')
]

html:

{% extends 'base.html' %}
{% load staticfiles %}
{% load embed_video_tags %}
{% block metadescription %}
    {% if category %}
        {{ category.description|truncatewords:155 }}
    {% else %}
        Welcome to the Cushion Store
    {% endif %}
{% endblock %}
{% block title %}
    {% if category %}
        {{ category.name }} - Perfect Cushion Store
    {% else %}
        See Our Cushion Collection - Perfect Cushion
    {% endif %}
{% endblock %}

{% block content %}





    <div class="my_header_samples">

        <br>
        <br>
        <br>
        <div class="container">
            <p class="my_samples_title">Paquete de muestras a S/10</p>
            <p>192 reviews<i class="gold-star fas fa-star-half-alt"></i>
                <i class="gold-star fas fa-star-half-alt"></i>
                <i class="gold-star fas fa-star-half-alt"></i>

            </p>

            <div class="row">

                <div class="text-center">
                    <a href="{% url 'shop:SamplePack' 'muestras' 'sample-pack' %}"
                    class="btn btn-azul text-white btn-block">Agregar al carrito</a>
                </div>

            </div>

        </div>
    </div>

    <br>
    <br>


    <div class="container">

    <br>
    <br>
    <br>

    <p class="my_samples_subtitle text-center">O también puedes obtener tus muestras con tu diseño personalizado.</p>

    <br>


        <div class="row col-md-12">
            {% for muestra in muestras %}
                <div class="col-md-3">
                    <div class="text-center">
                        <a href="{{muestra.get_url }}"><img class="my_image_medium"
                                                             src="{{ muestra.image.url }}"
                                                             alt="{{ muestra.name }}"></a>
                    </div>
                    <p class="text-center">{{ muestra.name }}</p>
                </div>
            {% endfor %}
        </div>

    <br>
    <br>

                <div class="row col-md-12">

                <p class="text-center">

                    {% video categoria_muestras.video as my_video %}

                    {% video my_video "medium" %}
                    {% endvideo %}

                </p>

                </div>


    </div>

    <br>
    <br>

{% endblock %}

Upvotes: 0

Views: 44

Answers (1)

schillingt
schillingt

Reputation: 13731

I think the problem is your shop/urls.py file. You need to arrange it so that the more specific urls are caught first, then the more generic ones later.

urlpatterns = [
    path('admin', admin.site.urls),
    path('', views.allCat, name='allCat'),
    path('muestras', views.SamplePackPage, name='SamplePackPage'),
    path('province/', views.get_province, name='province'),
    path('district/', views.get_district, name='district'),
    path('quienes_somos/', views.quienes_somos, name='quienes_somos'),
    path('<slug:c_slug>/<slug:product_slug>/medida-y-cantidad', views.StepOneView.as_view(), name='ProdDetail'),
    path('<slug:c_slug>/<slug:product_slug>/subir-arte', views.StepTwoView.as_view(), name='UploadArt'),
    path('<slug:c_slug>/<slug:product_slug>', views.SamplePack, name='SamplePack'),
    path('<slug:c_slug>', views.ProdCatDetail, name='ProdCatDetail'),
]

What's happening is that when you were browsing to /muestras/ it was catching on the ProdCatDetail url because it was higher up in the list and that muestras is a valid slug. If you are going to have dynamic urls at a root, you need to put them last in the list so that everything else can still be triggered.

Upvotes: 1

Related Questions