我是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有关,正如它在“异常位置”中所说的那样,但是在我尝试使用模型实例之后,一切都出现了。
感谢您的帮助。
答案 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 并解决了。也许它与敏感的资本类名称有关