2017-05-24 12 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混乱があった場合でもモデルをアップロードしました。 – max89

関連する問題