错误' NoneType'对象没有属性' _default_manager'当我创建一个Model实例的视图

时间:2014-08-19 13:59:04

标签: django feincms

我是Django的新手,我正在开发一个应用程序,但我陷入了这个错误。 首先,我想为我的英语道歉,因为这不是我的第一语言,然后我希望我能在正确的地方寻求帮助。

我正在开发一个关于文章发布的网站。页面“Publication”返回模型实例的列表 - 在我的例子中是db中的所有出版物。

我要做的是为我的模型的每个实例分配一个url,以便用户可以单击它并查看填充了该实例的其他相关信息的页面。

要做到这一点,我在我的模板中使用get_absolute_url,在我的视图中使用DetailView。 所有实例的列表工作正常,但是当我单击每个实例时,我运行错误'NoneType'对象没有属性'_default_manager'。 我已经谷歌了,并尝试在这里和那里遵循一些指导方针,并尝试在Django doc找到解决方案找不到解决方案......

这是我的代码:

models.py

class Publications(MPTTModel):
    code = models.CharField(max_length=50)
    title = models.CharField(max_length=150)
    date = models.DateField(null=True)
    magazine = models.CharField(max_length=50)
    country = models.CharField(max_length=30)
    slug = models.SlugField(max_length=150)
    img01 = models.ImageField(upload_to="photo", blank=True, null=True)
    link = models.URLField(max_length=200, blank=True, null=True)
    template = models.ForeignKey("Template", related_name="publications", null=True, blank=True)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
    control_field = models.CharField(max_length=15)
    class Meta:
        verbose_name_plural = "Publications"
    def __unicode__(self):
        return self.title
    def get_absolute_url(self):
        return reverse('mag-publication',args=(self.slug,))

publications.html

{% load mptt_tags %}
{% load sito_tags %}
{% full_tree_for_model myApp.Publications as publications %}
{% for publications,structure in publications|tree_info %}  
    {% if publications.img01 %}
    <div id="title_publication_container">
        <a href="{{ publications.get_absolute_url }}">{{ publications.magazine }}</a>
    </div>                      
    {% else %}                          
        ....    
    {% endif %} 
{% endfor %}

urls.py

urlpatterns = patterns('',  
url(r'^(?P<id_page>\d+)/(?P<slug>[\w-]+)/$', pages,),
url(r'^(?P<id_page>\d+)/(?P<slug_page>[\w-]+)/(?P<id>\d+)/(?P<slug>[\w-]+)/$', projects,),
url(r'^mag-publication/(?P<slug>[\w-]+)/$', PublicationDetailView.as_view() , name='mag-publication'),

view.py

class PublicationView(object):
    queryset = Publications.objects.all()

class PublicationListView(PublicationView, ListView):
    paginate_by = 20

class PublicationDetailView(PublicationView, DetailView):
    slug_field = 'slug'

错误显示了这个Debug信息:

AttributeError at /6/publications/*title_publication*/
**'NoneType' object has no attribute '_default_manager'**

Request Method:     GET
Request URL:    .../6/publications/*title_publication*/
Django Version:     1.5.4
Exception Type:     AttributeError
Exception Value:    'NoneType' object has no attribute '_default_manager'
Exception Location:     /home/gabriele/virtual_envs/virt2/lib/python2.7/site-packages/feincms/views/cbv/views.py in get_object, line 20
Python Executable:  /home/gabriele/virtual_envs/virt2/bin/python

也许问题与feincms有关,正如它在“异常位置”中所说的那样,但是在我尝试使用模型实例之后,一切都出现了。

感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

根据documentation,您可能无法将feincms.module.page添加到INSTALLED_APPS。如果您遵循回溯,则错误会显示在get_object()中,它会尝试访问页面模型。

您使用的是较旧的FeinCMS版本吗?在这种情况下,较新版本会发出警告。

答案 1 :(得分:0)

嗯,我不知道为什么,但在你的观点中,你有:

class PublicationView(object):
    queryset = Publications.objects.all()

class PublicationListView(PublicationView, ListView):
    paginate_by = 20

class PublicationDetailView(PublicationView, DetailView):
    slug_field = 'slug'

首先,如果他的名字已经是'slug',你不需要设置slug字段。

还有一件事:

您从PublicationDetailView中的PublicationView继承,但DetailView需要一个对象,只需在您的url文件中尝试这样:

url(r'^mag-publication/(?P<slug>[\w-]+)/$', DetailView.as_view(model=Publications) , name='mag-publication')

当然不要忘记将DetailView和Publications模型导入到您的url文件中。

EDIT 20/08/2014

在您使用的get_absolute_url方法中:

return reverse('mag-publication',args=({'slug':self.slug}))

如果你想使用dict for params,你必须使用:

return reverse('mag-publication',kwargs={'slug':self.slug})

如果你想使用args,你必须这样做:

return reverse('mag-publication',args=(self.slug,))

答案 2 :(得分:0)

我解决了部分问题。我使用了get_absolute_url和DetailView的组合。 我可以在publication.html中看到完美的出版物列表,但是当我点击其中一个时,应用程序会在publications_detail.html中显示 - 模型的所有实例的详细信息而不是一个。 来自admin&#34; site on site&#34;它有效,但有相同的问题,一起向我展示所有实例。 问题是如何只捕获一个实例。请遵循以下代码:

<强> models.py

class Publications(MPTTModel):
    title = models.CharField(max_length=150)
    slug = models.SlugField(max_length=150)
    img01 = models.ImageField(upload_to="photo", blank=True, null=True) 
    template = models.ForeignKey("Template", related_name="publications", null=True, blank=True)
    parent = models.ForeignKey('self', null=True, blank=True, related_name='children')
    control_field = models.CharField(max_length=15)
    class Meta:
        verbose_name_plural = "Publications"
    def __unicode__(self):
        return self.title
    def get_absolute_url(self):
        return reverse('mag-publication',args=(self.slug,))

views.py

class PublicationsDetail(DetailView): 
    queryset = Publications.objects.all() 
    template_name = 'website/publications_detail.html' 

urls.py

url(r'^mag-publication/(?P<slug>[\w-]+)/$', PublicationsDetail.as_view() 

<强> publications_detail.html

{% load mptt_tags %}
{% load sito_tags %}
{% full_tree_for_model napeApp.Publications as publications %}
{% for publications,structure in publications|tree_info %}  
    {% if publications.img01 %}
        <div id="title_publication_container">
        <a href="{{ publications.get_absolute_url }}">{{ publications.magazine     }}</a>
        </div>                      
    {% else %}
    ....        
    {% endif %} 
{% endfor %}

答案 3 :(得分:0)

就我而言,我只是将 meta 重命名为 Meta 并解决了。也许它与敏感的资本类名称有关