'function'对象没有属性'as_view'

cod*_*321 17 python django django-class-based-views

我试图使用基于类的视图,并得到一个奇怪的错误.我使用视图的方式似乎是正常的方式:

配料/ models.py:

from django.db import models
from django.utils import timezone


class Ingredient(models.Model):
    name        = models.CharField(max_length=255)
    description = models.TextField()

    def get_prices():
        purchases   = self.purchase_set.all()
        prices      = [purchase.price for purchase in purchases]
Run Code Online (Sandbox Code Playgroud)

配料/ views.py:

from django.shortcuts           import render, render_to_response, redirect
from django.http                import HttpResponse, HttpResponseRedirect
from django.views.generic.edit  import CreateView
from .models                    import Ingredient, Purchase

def IngredientCreateView(CreateView):
    model = Ingredient
    fields = ['all']
Run Code Online (Sandbox Code Playgroud)

配料/ urls.py:

from django.conf.urls import patterns, include, url

from ingredients.views import IngredientCreateView

urlpatterns = patterns('',            
    url(r'^new_ingredient$',          IngredientCreateView.as_view(),             name='new-ingredient'),
)
Run Code Online (Sandbox Code Playgroud)

我明白了

AttributeError at /ingredients/new_ingredient
'function' object has no attribute 'as_view'
Run Code Online (Sandbox Code Playgroud)

我在django 1.8.5.为什么这个观点不起作用?谢谢

kru*_*ubo 36

就我而言,问题在于我试图在基于类的视图上使用 @decorator ,就好像它是基于函数的视图一样,而不是正确地 @decorating 类

编辑:从链接页面,这是一种将 @login_required 应用于基于类的视图的方法:

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

@method_decorator(login_required, name='dispatch')
class ProtectedView(TemplateView):
Run Code Online (Sandbox Code Playgroud)


Anu*_*dra 27

IngredientCreateView应该是一个班级.所以你的views.py取代:

def IngredientCreateView(CreateView):
Run Code Online (Sandbox Code Playgroud)

有:

class IngredientCreateView(CreateView):
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,我为“viewset”和“model”指定了相同的名称。给他们不同的名字解决了我的问题 (2认同)

fal*_*tru 7

IngredientCreateView 是一个功能,而不是一个类.

以下行

def IngredientCreateView(CreateView):
Run Code Online (Sandbox Code Playgroud)

应该替换

class IngredientCreateView(CreateView):
Run Code Online (Sandbox Code Playgroud)