简体   繁体   English

AttributeError:“ NoneType”对象没有属性,因为相关的对象没有在视图中

[英]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)有两个模型对象, OrgEvent具有相应的对象视图,没有问题/错误。 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.

相关问题 错误AttributeError:&#39;NoneType&#39;对象没有属性&#39;title&#39;-&gt;由于类为空 - Error AttributeError: 'NoneType' object has no attribute 'title' -> due to an empty class AttributeError: &#39;NoneType&#39; 对象没有属性 &#39;name&#39;(与不同的 tensorflow 版本有关) - AttributeError: 'NoneType' object has no attribute 'name' ( related to different tensorflow versions ) AttributeError: &#39;NoneType&#39; 对象没有属性 - AttributeError: 'NoneType' object has no attribute AttributeError:“ NoneType”对象没有属性“ a” - AttributeError: 'NoneType' object has no attribute 'a' AttributeError:&#39;NoneType&#39;对象没有属性&#39;split&#39;? - AttributeError: 'NoneType' object has no attribute 'split'? Celery - AttributeError:&#39;NoneType&#39;对象没有属性&#39;delay&#39; - Celery - AttributeError: 'NoneType' object has no attribute 'delay' &#39;AttributeError:&#39;NoneType&#39;对象没有属性&#39;to_dict&#39; - 'AttributeError: 'NoneType' object has no attribute 'to_dict' AttributeError: &#39;NoneType&#39; 对象没有属性 &#39;findAll&#39; - Python - AttributeError: 'NoneType' object has no attribute 'findAll' - Python AttributeError:“ NoneType”对象没有属性“ div” - AttributeError: 'NoneType' object has no attribute 'div' AttributeError: &#39;NoneType&#39; 对象没有属性 &#39;name&#39;? - AttributeError: 'NoneType' object has no attribute 'name'?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM