检查视图的上下文数据 - Django?

时间:2017-11-25 09:50:41

标签: django django-models django-views django-urls

我是Django的新手,我可以说我有像collegedepartment这样的模态,如下所示

class College(models.Model):
      name = models.CharField()
      is_active = models.BooleanField()

class Department(models.Model):
      name = models.CharField()
      college = models.ForeignKeyField()

现在我有DepartmentListViewDepartmentCreateViewDepartmentUpdateView等观点来列出,创建,更新部门。我想在添加,列出,更新部门之前检查college的is_active(True)。目前我正在使用get_context_data,如关注

def get_context_data(self, **kwargs):
    context = super(DepartmentListView, self).get_context_data(**kwargs)
    try:
        college_id = self.kwargs.get('position_id')
        context['college'] = College.objects.get(pk=college_id, is_active = True)
    except College.DoesNotExist:
        raise Http404
    return context

但我正在重复相同的代码块,一次又一次,我想检查部门app中所有视图的大学is_active。我可以实现这一点而不重复。

2 个答案:

答案 0 :(得分:0)

为什么不在大学模型中创建一个类方法并在所有视图中使用它?

这是我的示例代码。

class College(models.Model):
      name = models.CharField()
      is_active = models.BooleanField()

      def get_is_active(self):
          return self.is_active

定义上面的方法,并在所有视图中使用如下所示。

College.objects.get(id=college_id).get_is_active()

答案 1 :(得分:0)

使用快捷方式get_object_or_404像这样:

my_object = get_object_or_404(MyModel, pk=1)

或者在您的具体案例中:

def get_context_data(self, **kwargs):
    context = super(DepartmentListView, self).get_context_data(**kwargs)
    college_id = self.kwargs.get('position_id')
    context['college'] = get_object_or_404(College, pk=college_id, is_active=True)
    return context

替代

您还可以为您的College模型定义manger

class CollegeManager(models.Manager):
    def active(self):
        return super(CollegeManager, self).get_queryset().filter(is_active=True)


class College(URLMixin, BaseModel):
    objects = CollegeManager()

在您看来,您现在可以这样做:

get_object_or_404(College.objects.active(), pk=college_id)

请注意,.active()还可以返回对列表有用的所有有效的College对象。

您的代码重复可以进一步减少。创建经理方法get_active

def get_active(self, pk):
    return get_object_or_404(
        super(CollegeManager, self).get_queryset().filter(is_active=True),
        pk=pk
    )

在视图中:

College.objects.get_active(college_id)

我从未尝试过最后一个get_active示例,ymmv。