Python-en-equipo / MarketPlace

Aplicación web Tipo Marketplace, registro de usuarios, post y compras de usuarios y vendedores desarrollada con Django y Tailwind
11 stars 1 forks source link

Categorías ya sirven. #40

Open Arturomtz8 opened 2 years ago

Arturomtz8 commented 2 years ago

Ángel ya habia avanzado mostrando los nombres de las categorías en el navbar, pero faltaba vincular los productos que correspondieran a cada categoría y mostrarlos así conforme el usuario diera click en alguna categoría.

Estos fueron los cambios que hice:

# ecommerce/views.py
def home(request):
    products = Product.objects.all()
    product_count = products.count()

    return render(request, "ecommerce/home.html", {"products": products, "product_count": product_count})
<!-- templates/ecommerce/home.html -->

<header class="border-bottom mb-4 pb-3">
    <div class="form-inline">
        <span class="mr-md-auto"><b> {{product_count}} </b> productos en total </span>
    </div>
</header>

imagen

#ecommerce/models.py
class Category(models.Model):
    title = models.CharField(max_length=255, unique=True)
    slug = models.SlugField(max_length=255, null=True, blank=True, unique=True)

No te olvides de correr makemigrations y migrate.

# ecommerce/admin.py
class CategoryAdmin(admin.ModelAdmin):
        # esto llenará el slug en automático con el titulo del modelo category
    prepopulated_fields = {'slug': ('title',)}
        # estos son los campos que se mostrarán en la página de admin
    list_display = ('title', 'slug')

admin.site.register(Category, CategoryAdmin)

Sólo preocúpate por escribir el title, Django rellenará el campo de slug mágicamente:

imagen

#ecommerce/urls.py
from .views import category

# no borrar porque los templates usan la appname
app_name = "ecommerce"

urlpatterns = [
    path("category/<slug:category_slug>", category, name="category"),
]
#ecommerce/views.py
def category(request, category_slug=None):
# localiza primero qué categoria se está pasando en la URL
    category_instance = get_object_or_404(Category, slug=category_slug)
# Filtra los productos que pertenezcan a esa categoría
    products = Product.objects.filter(category=category_instance)
    product_count = products.count()

    return render(request, "ecommerce/home.html", {"products": products, "product_count": product_count})

En el navbar.html se muestran las categorías creadas con este for loop que ya había implementado Ángel:

<!-- templates/navbar.html -->
{% for i in menu_categories %}
      <li>
          <a class="btn btn-outline-secondary" href="{% url 'ecommerce:category' i.slug %}">{{ i.title }}</a>
      </li>
{% endfor %}

Al darle click a una categoría, te mostrará solo los productos relacionados con ella:

imagen

CodeRagnarok07 commented 2 years ago

WTF Yo no habia echo todo eso antes? el formulario debes editarlo de manera que no muestre el campo slug en el formulario html

Arturomtz8 commented 2 years ago

Si, pero no servian los botones, nada mas estaban de adorno :0 y lo del formulario, eso que ves en captura de pantalla es de admin, en el formulario html no se muestra el slug

CodeRagnarok07 commented 2 years ago

detalles* pero se daba display de las variables en el navbar que era lo importante, y para que hicisteis todo ese tutorial?

Arturomtz8 commented 2 years ago

Para recordar 🤔 y documentar para David que es nuevo en el proyecto

CodeRagnarok07 commented 2 years ago

Ta chido lo de la url automática y con formato slugify, pero no funciona para los formularios si no quieres usar el admin verdad? tendrias que seguir usando el codigo largo anterior

Arturomtz8 commented 2 years ago

exacto, pero como sólo los superusers hacen categories, realmente creo que desde admin es funcional