I am trying to develop a website with Django 2.1.3 and python 3.7.1 When I go to the homepage I get this error:
TypeError at / __init__() takes 1 positional argument but 2 were given
Here are some details about the code I write:
Traceback
Environment: Request Method: GET Request URL: http://127.0.0.1:8000/ Django Version: 2.1.3 Python Version: 3.7.1 Installed Applications: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'core', 'crispy_forms'] Installed Middleware: ['django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware'] Traceback: File "C:\Users\andre\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" in inner 34. response = get_response(request) File "C:\Users\andre\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response 126. response = self.process_exception_by_middleware(e, request) File "C:\Users\andre\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response 124. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\andre\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view 21. return view_func(request, *args, **kwargs) Exception Type: TypeError at / Exception Value: __init__() takes 1 positional argument but 2 were given
core/models.py
This is just one table on DB:
from django.db import models class Evento(models.Model): titolo_evento = models.CharField(max_length=30) data_inizio = models.DateTimeField() data_fine = models.DateTimeField() def __str__(self): return self.titolo_evento class Meta: verbose_name = 'Evento' verbose_name_plural = 'Eventi'
core/views.py
Here I want to see the DB "Eventi" on the homepage only if the user is authenticated, i think the mistake is here, but i don't know where:
from django.contrib.auth.decorators import login_required from .models import Evento from django.views.generic.list import ListView @login_required class HomeView(ListView): queryset = Evento.objects.all() template_name = 'core/homepage.html' context_object_name = 'lista_eventi'
core/urls.py
from django.urls import path from . import views urlpatterns = [ path('', views.HomeView, name='homepage'), ]
urls.py(project)
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('core.urls')), path('accounts/', include('django.contrib.auth.urls')) ]
The Python "TypeError: takes 2 positional argument but 3 were given" occurs for multiple reasons: Forgetting to specify the self argument in a class method. Forgetting to specify a third argument in a function's definition. Passing three arguments to a function that only takes two.
Positional arguments are arguments that can be called by their position in the function call. Keyword arguments are arguments that can be called by their name. Required arguments are arguments that must passed to the function. Optional arguments are arguments that can be not passed to the function.
You need use as_view() at the end of class based views when declaring in the urls:
path('', views.HomeView.as_view(), name='homepage'),
Also, when using login_required
decorator, you need to use it on dispatch method of CBV:
from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator class HomeView(ListView): @method_decorator(login_required) def dispatch(self, *args, **kwargs): return super(HomeView, self).dispatch(*args, **kwargs)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With