[英]AttributeError: 'NoneType' object has no attribute due to related object slug not in view
my app (deployed to Heroku fwiw) had two model objects, Org
and Event
with corresponding object views and no issues/errs. 我的应用程序(部署到Heroku fwiw)有两个模型对象,
Org
和Event
具有相应的对象视图,没有问题/错误。 when I introduced a third object Theme
and modified some url routes to use its slug, I'm now getting the following err requesting the view for Org
(url path whose view takes org.slug
as a param): 当我引入第三个对象
Theme
并修改了一些URL路由以使用其Slug时,我现在得到以下err请求Org
的视图(其URL路径将org.slug
作为参数的视图):
AttributeError: 'NoneType' object has no attribute 'org'
and a 404
AttributeError: 'NoneType' object has no attribute 'org'
和404
orgs.models.py orgs.models.py
class Org(models.Model):
name = models.CharField(max_length=100, unique=True)
slug = AutoSlugField(populate_from='name')
themes = models.ManyToManyField('common.Theme', related_name='orgs', blank=True)
...
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('org-detail', args=[self.slug])
class Event(models.Model):
org = models.ForeignKey('Org', on_delete=models.CASCADE, related_name='events')
name = models.CharField(max_length=120)
slug = AutoSlugField(populate_from='name', unique_with='org', sep='-')
...
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('event-detail', args=[self.org.slug, self.slug])
common.models.py common.models.py
class Theme(models.Model):
name = models.CharField(max_length=50)
slug = AutoSlugField(populate_from='name')
class Meta:
ordering = ['name']
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse('themes', args=[self.slug])
orgs.urls.py orgs.urls.py
urlpatterns = [
url(r'^org/(?P<org_slug>[-\w]+)/?$', views.org, name='org-detail'),
url(r'^org/(?P<org_slug>[-\w]+)/event/(?P<slug>[-\w]+)/', include([
url(r'^$', views.event, name='event-detail'),
...
])),
...
]
common.urls.py common.urls.py
urlpatterns = [
url(r'^(?P<slug>[-\w]+)/?$', views.theme, name='theme'),
...
]
orgs.views.py orgs.views.py
def event(request, org_slug, slug):
event = Event.objects.filter(slug=slug).order_by('id').first()
if event.org.slug != org_slug:
raise Http404
event_url = '{}{}{}'.format(settings.DEFAULT_PROTOCOL, settings.APP_DOMAIN, event.get_absolute_url())
context = {
'event': event,
'event_url': event_url,
'event_url_encode': urlquote_plus(event_url),
}
return render(request, 'orgs/event.html', context)
def org(request, slug, role=None):
try:
org = Org.objects.get(slug=slug)
except Org.DoesNotExist:
return HttpResponseBadRequest()
context = {
'org': org,
}
return render(request, 'orgs/org.html', context)
views.event returns valid response as expected. views.event返回预期的有效响应。 views.org used to, but now returns 404. the log err actually shows the err being generated by views.event, but I don't understand why:
views.org曾经使用过,但是现在返回404。日志err实际上显示了views.event生成的err,但是我不明白为什么:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py", line 41, in inner
response = get_response(request)
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 249, in _legacy_get_response
response = self._get_response(request)
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 187, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/app/.heroku/python/lib/python3.6/site-packages/channels/handler.py", line 237, in process_exception_by_middleware
return super(AsgiHandler, self).process_exception_by_middleware(exception, request)
File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py", line 185, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/app/.heroku/python/lib/python3.6/contextlib.py", line 52, in inner
return func(*args, **kwds)
File "/app/project/utils/helpers.py", line 28, in _decorated
return view(request, *args, **kwargs)
File "/app/.heroku/python/lib/python3.6/site-packages/htmlmin/decorators.py", line 13, in minify
response = f(*args, **kwargs)
File "/app/orgs/views.py", line 243, in event
if event.org.slug != org_slug:
AttributeError: 'NoneType' object has no attribute 'org'
in debug mode Django says: No Theme matches the given query.
在调试模式下,Django说:
No Theme matches the given query.
raised by project.utils.helpers._decorated
for GET app.com/org/valid-org-slug
. 由
project.utils.helpers._decorated
为GET app.com/org/valid-org-slug
。 why is Theme being called in that query (or Theme's slug being used as an arg instead of org?) - it's not used or requested by views.event or views.org? 为什么在该查询中调用主题(或将主题的子弹用作arg而不是组织?)-views.event或views.org未使用或未请求它? and how can Event be
NoneType
for views.org if view.event returns the correct object? 如果view.event返回正确的对象,则如何将
NoneType
Event设置为NoneType? thanks 谢谢
Actually the problem here in the code is with first() . 实际上,代码中的问题在于first() 。
first
returns None if there is no matching object in the queryset. 如果查询集中没有匹配的对象,则
first
返回None。 You should change the line like this: 您应该像这样更改行:
events = Event.objects.filter(slug=slug).order_by('id')
if events.exists():
event = events.first()
I elimated the err by changing the url path in common.urls from 我通过更改common.urls中的url路径消除了错误
url(r'^(?P<slug>[-\w]+)/?$', views.theme, name='theme'),
to: 至:
url(r'^foo/(?P<slug>[-\w]+)/?$', views.theme, name='theme'),
after that views.event and views.org work as expected. 之后,views.event和views.org会按预期工作。 the url config I was using was causing a regex issue that created the underlying NoneType err.
我使用的url配置引起了正则表达式问题,该问题创建了基础的NoneType错误。 I still don't fully understand the cause/source of the regex issue.
我仍然不完全了解正则表达式问题的原因/来源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.