【问题标题】:django 1.9 AttributeError: 'unicode' object has no attribute '_meta'django 1.9 AttributeError:'unicode'对象没有属性'_meta'
【发布时间】: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


【解决方案1】:

您的get_queryset 方法应该返回一个查询集。您正在使用get(),它返回一个实例。

如果你只想显示单个项目,那么DetailView 会比ListView 更合适。

【讨论】:

  • 我切换到详细视图,现在可以正常使用了,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
相关资源
最近更新 更多