为什么基于类的视图返回类型对象'Profile'没有属性'model'?

时间:2017-08-17 20:44:11

标签: django django-views django-urls django-class-based-views

我有一个django的网站。

这是项目urls.py:

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('accounts.urls')),
url(r'^login/$', LoginView.as_view(), name='login'),
url(r'^register/$', RegisterView.as_view(), name='register'),
url(r'^logout/$', logout_view, name="logout")
]

这是accounts.urls:

from . import views
urlpatterns = [
url(r'(?P<username>[\w]+)/$', views.Profile.as_view(), name='profile_cbv'),
]

这是个人资料模型:

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='profile', verbose_name='user', on_delete=models.CASCADE)
    name = models.CharField(max_length=30, verbose_name='name')
    family = models.CharField(max_length=50, verbose_name='family')

最后,这是基于Profile类的视图:

class Profile(View):
def get(self, request, username=None):
    profile = get_object_or_404(Profile, user__username=username)

    print(profile)
    pass

例如,我转到下面的网址:

localhost:8000/ivan/

它提出错误:

AttributeError at /ivan/
type object 'Profile' has no attribute 'model'

如果我通过url传递正确或不正确的用户名来查看,那么它会引发该错误。

问题是什么?

2 个答案:

答案 0 :(得分:2)

当您致电get_object_or_404(Profile, ...)时,Profile不是型号,而是视图。这就是你收到错误的原因。

尝试将class Profile(View)重命名为class ProfileView(View)

from . import views
urlpatterns = [
    url(r'(?P<username>[\w]+)/$', views.ProfileView.as_view(), name='profile_cbv'),
]

在您的views.py

class ProfileView(View):
    def get(self, request, username=None):
        profile = get_object_or_404(Profile, user__username=username)

        print(profile)
        pass

答案 1 :(得分:1)

它看起来像是视图中的名称问题。您的视图类名称与模型类相同。将Model类导入为其他类。例如:

  

从.models导入Profile作为ProfileModel

然后在视图中以那种方式调用模型。