![](/img/trans.png)
[英]Error AttributeError: 'NoneType' object has no attribute 'title' -> due to an empty class
[英]AttributeError: 'NoneType' object has no attribute due to related object slug not in view
我的應用程序(部署到Heroku fwiw)有兩個模型對象, Org
和Event
具有相應的對象視圖,沒有問題/錯誤。 當我引入第三個對象Theme
並修改了一些URL路由以使用其Slug時,我現在得到以下err請求Org
的視圖(其URL路徑將org.slug
作為參數的視圖):
AttributeError: 'NoneType' object has no attribute 'org'
和404
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
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
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
urlpatterns = [
url(r'^(?P<slug>[-\w]+)/?$', views.theme, name='theme'),
...
]
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返回預期的有效響應。 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'
在調試模式下,Django說: No Theme matches the given query.
由project.utils.helpers._decorated
為GET app.com/org/valid-org-slug
。 為什么在該查詢中調用主題(或將主題的子彈用作arg而不是組織?)-views.event或views.org未使用或未請求它? 如果view.event返回正確的對象,則如何將NoneType
Event設置為NoneType? 謝謝
實際上,代碼中的問題在於first() 。 如果查詢集中沒有匹配的對象,則first
返回None。 您應該像這樣更改行:
events = Event.objects.filter(slug=slug).order_by('id')
if events.exists():
event = events.first()
我通過更改common.urls中的url路徑消除了錯誤
url(r'^(?P<slug>[-\w]+)/?$', views.theme, name='theme'),
至:
url(r'^foo/(?P<slug>[-\w]+)/?$', views.theme, name='theme'),
之后,views.event和views.org會按預期工作。 我使用的url配置引起了正則表達式問題,該問題創建了基礎的NoneType錯誤。 我仍然不完全了解正則表達式問題的原因/來源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.