0

i keep getting this error in every view of my Django project: categoryFilter() missing 1 required positional argument: 'category_slug'.

website is my app name.

I don't know why I keep getting this error and I'm new in Django, so your helps make me happy. Here is my django views.py, urls.py, models.py and settings.py files,

My views.py:

from django.shortcuts import render
from django.shortcuts import get_object_or_404
from .models import Service, Category

# Create your views here.
def home(request):
    return render(request, "website/home.html")

def services(request):
    return render(request, "website/services.html")

def allCategories(request):
    return {
        'categories': Category.objects.all() 
    }

def portfolio(request):
    service = Service.objects.all()
    return render(request, "website/portfolio.html", {'services': service})

def serviceDetail(request, slug):
    service = get_object_or_404(Service, slug = slug, is_active = True)

def categoryFilter(request, category_slug):
    selected = get_object_or_404(Category, slug = category_slug)
    service = Service.objects.filter(category = selected)
    return render(request, 'website/portfolio-category.html', {'category': selected, 'service': service})

My urls.py:

from django.urls import path
from . import views

# app_name = 'website'

urlpatterns = [
    path('', views.home, name = 'home'),
    path('index', views.home),
    path('services', views.services, name = 'services'),
    path('portfolio', views.portfolio, name = 'portfolio'),
    path('our-story', views.our_story, name = 'our_story'),
    path('contact-us', views.contact_us, name = 'contact_us'),
    path('login', views.login, name = 'login'),
    path('register', views.register, name = 'register'),
    path('profile', views.profile, name = 'profile'),
    path('cart', views.cart, name = 'cart'),
    path('search/<slug:category_slug>/', views.categoryFilter, name="categoryFilter"),
    path('service/<slug:slug>/', views.serviceDetail, name="serviceDetail")
]

My models.py:

from django.db import models
from django.urls import reverse

class Category(models.Model):
    name = models.CharField(max_length = 100, db_index = True)
    slug = models.SlugField(max_length = 105, unique = True)

    class Meta:
        verbose_name_plural = 'Categories'

    def get_absolute_url(self):
        return reverse('categoryFilter', args = [self.slug])
        # return reverse("categoryFilter", kwargs={"slug": self.slug})

    def __str__(self):
        return self.name
    
class Service(models.Model):
    category =  models.ForeignKey(Category, related_name = 'service', on_delete=models.CASCADE)
    name = models.CharField(max_length = 100)
    description = models.TextField(blank = True)
    image = models.ImageField(upload_to = 'static/website/img/')
    bigImage = models.ImageField(upload_to = 'static/website/img/')
    slug = models.SlugField(max_length = 105, unique = True)
    price = models.DecimalField(max_digits = 7, decimal_places = 2)
    is_active = models.BooleanField(default = True)

    class Meta:
        verbose_name_plural = 'Services'

    def __str__(self):
        return self.name

My settings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            BASE_DIR / "templates"
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'website.views.allCategories',
                'website.views.categoryFilter',
            ],
        },
    },
]

Portfolio-category.html:

{% extends 'base.html' %}
{% load static %}

{% block title %} Portfolio {% endblock title %}

{% block content %}

<div class="parallax-content projects-content" id="portfolio">
    <div class="container">
        <div class="">
            {% for category in categories %}
            <a class="" href="{{ category.get_absolute_url }}"><span> | {{ category.name }} | </span></a>
            {% endfor %}
        </div>  
        <div class="row">
            <div class="col-md-12">
                <div id="owl-testimonials" class="owl-carousel owl-theme">
                    {% for service in services %}
                    <div class="item">
                        <div class="testimonials-item">
                            <a href="{{ service.bigImage.url }}" data-lightbox="image-1"><img src="{{ service.image.url }}" alt=""></a>
                            <div class="text-content">
                                <h4> {{ service.name }} </h4>
                                <span>₺ {{service.price}} </span>
                                <button type="button" class="addCart btn btn-warning">Add to Cart!</button>
                            </div>
                        </div>
                    </div>
                    {% endfor %}
                </div>
            </div>
        </div>
    </div>
</div>

{% endblock content%}
erselbal
  • 17
  • 8

1 Answers1

0

You should remove 'website.views.allCategories' and 'website.views.categoryFilter' from the context_processors list in settings.py. When you place a function as a context processor, it gets executed every time when a request is received, but allCategories and categoryFilter functions take one more argument besides the request, but you are not able to provide additional arguments when you add them as a context processors.

Context processors must take only the request object and return a dictionary. Check this answer to see what a context is and how a context processor should be used: What is a context in Django?

Eduardo Matsuoka
  • 566
  • 6
  • 18
  • But this time, when I enter the "search/web/" slug for example, none of the data in the web category is added to the page. – erselbal Dec 21 '22 at 14:27
  • I think you are trying to loop categories in your Portfolio-category.html template, but you only providing category in your render function in categoryFilter in views.py – Eduardo Matsuoka Dec 21 '22 at 16:28