【发布时间】:2016-05-19 18:46:51
【问题描述】:
在 django 1.9 中使用 ListView 时出现以下错误
File "/Users/jeffrey.dambly/hyperion/lib/python2.7/site-packages/django/views/generic/list.py", line 201, in get_template_names
# If the list is a queryset, we'll invent a template name based on the
# app and model name. This name gets put at the end of the template
# name list so that user-supplied names override the automatically-
# generated ones.
if hasattr(self.object_list, 'model'):
opts = self.object_list.model._meta
names.append("%s/%s%s.html" % (opts.app_label, opts.model_name, self.template_name_suffix))
return names
AttributeError: 'unicode' object has no attribute '_meta'
这里是风景
class DeviceView(ListView):
model = LbDevice
template_name = 'loadbalancer/device.html'
context_object_name = 'device'
def get_queryset(self):
return self.model.objects.get(id=self.kwargs['pk'])
由于某种原因,我的模式似乎没有 ._meta,我不明白为什么,这是我的模型的样子
class LbDevice(models.Model):
label = models.CharField(max_length=64)
ip = models.GenericIPAddressField()
model = models.CharField(max_length=32, default=None, null=True)
version = models.CharField(max_length=32, default=None, null=True)
host_name = models.CharField(max_length=32, default=None, null=True)
state = models.CharField(max_length=32, default=None, null=True)
chassis_serial = models.CharField(max_length=32, default=None, null=True)
uptime = timedelta.fields.TimedeltaField(default=None, null=True)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
class Meta:
ordering = ['label']
def __unicode__(self):
return "%s" % self.label
如果我使用自己的方法过度使用 get_tempalte_names,则视图可以正常工作(它只是 TemplateResponseMixin 方法的复制面)。似乎当使用来自 MultipleObjectTemplateResponseMixin 的方法时会导致问题。
也使用 runserver_plus 我看到以下内容,object_list 确实具有 ._meta 属性,但如果我添加 .model._meta 我会收到错误
[console ready]
>>> self.object_list
<LbDevice: LbDevice object>
>>> self.object_list._meta
<Options for LbDevice>
>>>
【问题讨论】:
-
再看这个好像opts = self.object_list.model._meta,应该是opts = self.object_list._meta,这是bug吗?
-
不,因为
self.object_list是一个查询集并且没有 _meta 属性。您以某种方式用字符串覆盖了该属性。正如 Ludwik 所要求的,您需要展示代码。
标签: python django django-models django-views