2017-05-24 81 views
0

我正在構建一個列出課程的Web應用程序。我可以根據地點和類別篩選課程。但是,下一步是允許用戶登錄並將課程分配給他們的個人資料。我掙扎的地方是根據登錄憑證過濾課程。它可以完成嗎?我找不到任何東西,我一直在尋找幾天。我將從課程提供者開始。該過濾器在登錄具有外鍵的過程中,當然儀表盤(有每個組織多門課程):基於登錄詳細信息的Django過濾

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過濾器上的任何指針將不勝感激。

回答

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

+0

許多感謝您的回答中找到,我已經篡改它,以濾除課程但是,它現在只是說對象現在具有屬性'提供者'。這裏是代碼:'def get_queryset(self): return super()。get_queryset()。filter(username = self.request.user, provider__provider__iexact = self.provider ).order_by('date')'我有還上傳了模型incase有任何混淆。 – max89