Django根据登录详细信息进行过滤

时间:2017-05-24 00:44:37

标签: django django-views django-queryset django-login

我正在构建一个列出课程的网络应用程序。我可以根据位置和类别过滤课程。但是,下一步是允许用户登录并为其配置文件分配课程。我正在努力的是根据登录凭据过滤课程。甚至可以做到吗?我找不到任何东西,我一直在寻找。我将从课程提供者开始。一个仪表板,用于过滤登录具有外键课程的课程(每个组织有多个课程):

class ProviderProfile(models.Model):
    organisation = models.ForeignKey(Provider)
    username = models.ForeignKey(User)
    firstname = models.CharField(max_length=200)
    lastname = models.CharField(max_length=200)
    email = models.EmailField(max_length=200)

用户登录并点击仪表板视图后,我希望它返回与ProviderProfile附带的组织关联的所有课程。课程模型在模型中具有以下内容:provider = models.ForeignKey(Provider)。下面是我如何在其他视图中过滤课程的示例:

class Courses_By_Location(LoginRequiredMixin, ListView):
    template_name = 'courses/course_list.html'
    model = models.Course
    context_object_name = 'courses'

    def dispatch(self, request, *args, **kwargs):
        self.location = kwargs.get('location', 'DEFAULT-LOCATION')
        return super().dispatch(request, *args, **kwargs)

    def get_queryset(self):
        return date_screen(
            super().get_queryset().filter(location__gen_local__iexact=
                                          self.location).order_by('date'),
        )

    raw_courses = date_screen(models.Course.objects.all())

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['locations'] = location_screen(self.raw_courses)
        context['categories'] = category_screen(self.raw_courses)

        return context

这适用于按表单中选择的位置进行过滤。我的方法是以某种方式(这是我坚持的一点)获得登录所附属的组织并过滤其下的课程。 LoginRequiredMixin也存在问题,但它没有查询集。我猜他们以某种方式压倒它。编辑:由于其他人的要求,我已经为该课程提供了模型:

class Course(models.Model):

    provider = models.ForeignKey(Provider)

    title = models.CharField('Course Title', max_length=200,)
    first_line = models.CharField('Address Line: 1', max_length=200,)
    second_line = models.CharField('Address Line: 2', max_length=200,)
    third_line = models.CharField('Address Line: 3', max_length=200,)
    city = models.CharField('City', max_length=200,)
    post_code = models.CharField('Post Code', max_length=200,)
    course_description = models.TextField('Description')
    date = models.DateField('Date')

    start_time = models.TimeField('Starting time')
    finish_time = models.TimeField('Finishing time')
    duration = models.IntegerField('Number of hours')
    CPD = models.IntegerField('CPD points')
    link = models.CharField('Link', max_length=200)
    category = models.ForeignKey(Categories)
    gen_cat = models.ForeignKey(Gen_Categories)
    location = models.ForeignKey(Gen_Location)
    cost = models.FloatField('Cost') 

非常感谢您花时间阅读本文。我试图深入了解这个问题。通过登录凭据和覆盖LoginRequiredMixin对过滤器的任何指针都将非常感激。

1 个答案:

答案 0 :(得分:0)

当用户登录时,用户模型实例应该在请求对象上可用。即访问self.request.user。在您的示例中,可以在get_queryset中过滤课程,如下所示:

def get_queryset(self):
  return date_screen(
    super().get_queryset().filter(
      username=self.request.user,
      location__gen_local__iexact=self.location
    ).order_by('date')
  )

有关此问题的一些详细信息,请访问https://docs.djangoproject.com/en/1.11/ref/request-response/#attributes-set-by-middleware

相关问题