I’m trying to subclass the base generic View object provided by Django so that I can control the rendering of the view fully but still use the cleaner class-based view method instead of mapping to a function.
This is my view so far:
from django.views.generic.base import View
from django.shortcuts import render
from account.forms import UserForm, UserProfileForm
class RegisterView(View):
def get(request, *args, **kwargs):
user_form = UserForm()
profile_form = UserProfileForm()
return render(request, 'account/register.html', {'user_form': user_form, 'profile_form': profile_form})
def post(request, *args, **kwargs):
pass
When I try to navigate to the URL for this view I get this error from Django:
AttributeError at /account/register/
'RegisterView' object has no attribute 'META'
Request Method: GET
Request URL: http://localhost:8000/account/register/
Django Version: 1.4.3
Exception Type: AttributeError
Exception Value: 'RegisterView' object has no attribute 'META'
Exception Location: C:\Python27\lib\site-packages\django\core\context_processors.py in debug, line 35
Python Executable: C:\Python27\python.exe
Python Version: 2.7.3
Environment:
Request Method: GET
Request URL: http://localhost:8000/account/register/
Django Version: 1.4.3
Python Version: 2.7.3
Installed Applications:
('django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'account')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware')
Traceback:
File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in view
48. return self.dispatch(request, *args, **kwargs)
File "C:\Python27\lib\site-packages\django\views\generic\base.py" in dispatch
69. return handler(request, *args, **kwargs)
File "C:\project\account\views.py" in get
49. return render(request, 'account/register.html', {'user_form': user_form, 'profile_form': profile_form})
File "C:\Python27\lib\site-packages\django\shortcuts\__init__.py" in render
40. context_instance = RequestContext(request, current_app=current_app)
File "C:\Python27\lib\site-packages\django\template\context.py" in __init__
176. self.update(processor(request))
File "C:\Python27\lib\site-packages\django\core\context_processors.py" in debug
35. if settings.DEBUG and request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
Exception Type: AttributeError at /account/register/
Exception Value: 'RegisterView' object has no attribute 'META'
The documentation doesn’t specify anything about any “META attribute” when subclassing generic views, so I’m not sure what I’m doing wrong or if this is even a permitted usage of the base generic view.
I’m a bit new to (serious) Python programming and to Django, so please forgive me if I’m missing something obvious about this.
Remember this is a class: you’ve missed the
selfargument in the definitions ofgetandpost: