Ответ 1
def TestView(View):
должен быть class TestView(View):
. Как бы то ни было, вы определяете функцию с именем TestView
, которая принимает аргумент View
- его тело определяет внутреннюю функцию, а затем возвращает None
.
Я пытался какое-то время получить ModelResource или View, работая с помощью Django Rest Framework. Я следую примерам, но код в примерах не работает для меня. Может ли кто-нибудь сказать мне, почему я могу получить эту ошибку.
views.py
# Create your views here.
from django.http import HttpResponse
from django.utils import simplejson
from django.core import serializers
from djangorestframework.views import View
from djangorestframework.response import Response
from djangorestframework import status
from interface.models import *
def TestView(View):
def get(self, request):
return Person.objects.all()
urls.py
from django.conf.urls.defaults import *
from djangorestframework.resources import ModelResource
from djangorestframework.views import ListOrCreateModelView, InstanceModelView, View
from interface.models import *
from interface.views import *
class PersonResource(ModelResource):
model = Person
ordering = ('LastName')
urlpatterns = patterns('',
url(r'^$', 'interface.views.index'),
url(r'^testview/$', TestView.as_view()),
url(r'^people/$', ListOrCreateModelView.as_view(resource=PersonResource)),
)
Теперь я получаю объект "функция" ошибки, у которого нет атрибута "as_view".
def TestView(View):
должен быть class TestView(View):
. Как бы то ни было, вы определяете функцию с именем TestView
, которая принимает аргумент View
- его тело определяет внутреннюю функцию, а затем возвращает None
.
Так как это №1 в Google для этого сообщения об ошибке, и там более тонкая и, вероятно, общая причина для него, чем OPs, я размещаю этот комментарий здесь.
Эта ошибка также может быть вызвана использованием стандартного декоратора вида в представлении на основе класса, а не в методе __dispatch__
в представлении.
Чтобы добавить к точке Тима Сайлора,
https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#id1
Чтобы украсить каждый экземпляр класса-представления, вам нужно украсить само определение класса. Для этого вы применяете декоратор к dispatch() класса.
Метод класса не совсем то же, что и автономная функция, поэтому вы не можете просто применить декоратор функции к методу - вам нужно сначала преобразуйте его в декоратор метода. Метод_декоратор декоратор преобразует декоратор функции в декоратор метода, поэтому что его можно использовать в методе экземпляра. Например:
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView
class ProtectedView(TemplateView):
template_name = 'secret.html'
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
return super(ProtectedView, self).dispatch(*args, **kwargs)
Я также получаю эту ошибку, но в моем случае я решил ее с помощью следующей идеи.
Эта ошибка обычно возникает, если вы пытаетесь переопределить класс. Иногда это происходит, если вы скопируете и вставьте код и забудьте изменить, например. имя класса. Но в моем случае это было немного иначе
Если вы примените @login_required
к классу, вы получите сообщение об ошибке:
‘function’ object has no attribute ‘as_view’
Итак, как вы теперь украшаете классы в Django? Для представлений на основе классов у вас есть два варианта оформления ваших классов.
1) Украшение URLconf
2) Украшая класс
Оба варианта приводят к одному и тому же результату - ограничение доступа к классу только для зарегистрированных пользователей. Разница между параметрами заключается в том, как декоратор применяется к экземпляру класса. Реализовать эту страницу для реализации декораторов
https://docs.djangoproject.com/en/1.4/topics/class-based-views/#decorating-class-based-views
используйте это, если вы используете класс, ваш декоратор должен быть импортировать первым:
from django.utils.decorators import method_decorator
затем
@method_decorator(login_required(login_url='login'),name="dispatch")
class YourClassView(YourView):