1

ビューのレンダリングを完全に制御できるように、Django が提供する基本的なジェネリック View オブジェクトをサブクラス化しようとしていますが、関数にマッピングする代わりに、よりクリーンなクラスベースのビュー メソッドを使用します。

これまでの私の見解は次のとおりです。

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

このビューの URL に移動しようとすると、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'

ドキュメントでは、ジェネリック ビューをサブクラス化する際の「META 属性」について何も指定していないため、何が間違っているのか、またはこれがベース ジェネリック ビューの使用が許可されているのかさえわかりません。

私は (深刻な) Python プログラミングと Django に少し慣れていないので、これについて明らかな何かが欠けている場合はご容赦ください。

4

1 に答える 1

1

これはクラスであることを思い出してください:とselfの定義で引数を見逃しています:getpost

def get(self, request, *args, **kwargs):
于 2013-02-07T17:43:19.047 に答える