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

Posted

技术标签:

【中文标题】为啥基于类的视图返回类型对象\'Profile\'没有属性\'model\'?【英文标题】:why class-based view returned type object 'Profile' has no attribute 'model'?为什么基于类的视图返回类型对象'Profile'没有属性'model'? 【发布时间】:2018-01-26 10:24:05 【问题描述】:

我有一个 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 一起传递,则始终会引发该错误。

有什么问题?

【问题讨论】:

首先您应该将名为 Profile 的视图重命名为其他名称 【参考方案1】:

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

从 .models 导入 Profile 作为 ProfileModel

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

【讨论】:

【参考方案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

【讨论】:

是的,正如你所说,问题是因为模型和视图的名称相同。非常感谢 @MojtabaSalehiyan 不客气。如果我的回答对您有帮助,请务必将其标记为已接受。

以上是关于为啥基于类的视图返回类型对象'Profile'没有属性'model'?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 为啥没有基于返回类型的方法重载?

Django - 将变量从基于类的视图传递到模板

laravel 4 视图,在哪里放置基于类的作曲家

为啥我不能返回对使用模板创建的派生类的 unique_ptr 的引用?

如何在基于类的视图中使用LoginRequiredMixin来发送一个django错误信息?

在基于类的视图中返回 template_name + args