Django:在ListView中处理DoesNotExist

Django:在ListView中处理DoesNotExist,django,Django,我在列表视图中有一个自定义查询,它返回登录用户所属公司的所有站点。问题是,如果已创建用户,但没有网站属于公司,则会出现DoesNotExist错误。我想它加载一个模板,有一个添加网站按钮 models.py class Company(models.Model): ... class Site(models.Model): company = models.ForeignKey(Company) class UserProfile(models.Model): com

我在
列表视图
中有一个自定义查询,它返回登录用户所属
公司的所有
站点
。问题是,如果已创建
用户
,但没有
网站
属于
公司
,则会出现DoesNotExist错误。我想它加载一个模板,有一个添加网站按钮

models.py

class Company(models.Model):
    ...

class Site(models.Model):
    company = models.ForeignKey(Company)

class UserProfile(models.Model):
    company = models.ForeignKey(Company)
views.py

class SiteList(ListView):
    model = Site
    paginate_by = 25

    def get_queryset(self):
        p = UserProfile.objects.get(id=self.request.user.id)
        return Site.objects.filter(company=p.company)
如果找不到对象,则Model.objects.get()返回DoesNotExist错误。 您可以执行以下操作之一:

class SiteList(ListView):
    model = Site
    paginate_by = 25

    def get_queryset(self):
        try:
            p = UserProfile.objects.get(id=self.request.user.id)
        except UserProfile.DoesNotExist:
            #do something here
        return Site.objects.filter(company=p.company)


注意:。筛选器不会引发错误,它只会返回一个空列表

您可以按如下方式修改视图文件:

   from django.core.exceptions import ObjectDoesNotExist
   class SiteList(ListView):
       model = Site
       paginate_by = 25

       def get_queryset(self):
          try:
              p = UserProfile.objects.get(id=self.request.user.id)
              return Site.objects.filter(company=p.company)
          except ObjectDoesNotExist:
              # code to add

我不认为由于站点不存在而引发错误。这是因为UserProfile对象不存在。用户模型创建后是否立即创建用户配置文件模型?Site.objects.filter()如果没有属于某个公司的站点,则返回“None”。@gZing Site.objects.filter()如果没有属于某个公司的站点,则返回[],感谢您的更正。在第二个示例中,您不能使用
p.Company
,因为p是一个列表。使用
p[0]。公司
@TomaszJakubRup已修复
   from django.core.exceptions import ObjectDoesNotExist
   class SiteList(ListView):
       model = Site
       paginate_by = 25

       def get_queryset(self):
          try:
              p = UserProfile.objects.get(id=self.request.user.id)
              return Site.objects.filter(company=p.company)
          except ObjectDoesNotExist:
              # code to add