From 6aa45b424adbcc8080d70eb3ee1fd4f6a753ff79 Mon Sep 17 00:00:00 2001 From: wzy <1458201660@qq.com> Date: Sat, 1 Jun 2024 23:37:36 +0800 Subject: [PATCH] 0601 --- .../movie/__pycache__/urls.cpython-312.pyc | Bin 1490 -> 1452 bytes .../movie/__pycache__/views.cpython-312.pyc | Bin 16863 -> 21208 bytes djangoProject2/movie/apps.py | 2 +- djangoProject2/movie/forms.py | 20 ++--- djangoProject2/movie/urls.py | 4 +- djangoProject2/movie/views.py | 73 ++++++++++++++---- 6 files changed, 72 insertions(+), 27 deletions(-) diff --git a/djangoProject2/movie/__pycache__/urls.cpython-312.pyc b/djangoProject2/movie/__pycache__/urls.cpython-312.pyc index bcc71e78d9242edf842d993d75a9c87b42985a18..1887ad082bb22159093d10e5b08813c676177722 100644 GIT binary patch delta 69 zcmcb_y@s3jG%qg~0}%W)jZV8ckyny&%0_ig#?3yA-n;#uyV9 delta 72 zcmZ3(eTkd*G%qg~0}%W$h)jDjkyny&!$x&Z#>o#DWj7l#er00kDJ{w=NGzGG!;;D< aJ$VvK{$zJn!O5JgvpD&f8hMHofm#6(!xR1h diff --git a/djangoProject2/movie/__pycache__/views.cpython-312.pyc b/djangoProject2/movie/__pycache__/views.cpython-312.pyc index 51b96cf313bbe10f1c19197b808bbf73e0f54314..8850ab02ae88d3061f8fc95bfc4d3f96f116d86d 100644 GIT binary patch delta 4530 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 Sg0q!N9{G8+&I?_99sdTjDOs2R diff --git a/djangoProject2/movie/apps.py b/djangoProject2/movie/apps.py index 2ed287c0..c0525a1a 100644 --- a/djangoProject2/movie/apps.py +++ b/djangoProject2/movie/apps.py @@ -4,4 +4,4 @@ from django.apps import AppConfig class MovieConfig(AppConfig): name = 'movie' - verbose_name='电影推荐系统' \ No newline at end of file + verbose_name="电影推荐系统" \ No newline at end of file diff --git a/djangoProject2/movie/forms.py b/djangoProject2/movie/forms.py index 4ce838c1..35a354a1 100644 --- a/djangoProject2/movie/forms.py +++ b/djangoProject2/movie/forms.py @@ -5,15 +5,15 @@ from movie.model import User,Movie_rating class RegisterForm(forms.ModelForm): password_repeat=forms.CharField(max_length=256) - def get_erros(self): - erros=self.erros.get_json_data() - erros_lst=[] - for messages in erros.values(): - for messages_dict in messages: + def get_errors(self): + errors=self.errors.get_json_data() + errors_lst=[] + for messages in errors.values(): + for message_dict in messages: for key,message in message_dict.items(): if key=='messasge': - erros_lst.apppend(message) - return erros_lst + errors_lst.append(message) + return errors_lst def clean(self): @@ -37,12 +37,12 @@ class LoginForm(forms.ModelForm): model=User fields=['password'] - def get_error(self): + def get_errors(self): errors=self.errors.get_json_data() errors_lst=[] for messages in errors.values(): - for message_dict in messsages: - for key.message in message_dict.items(): + for message_dict in messages: + for key,message in message_dict.items(): if key=='messasge': errors_lst.append(message) return errors_lst diff --git a/djangoProject2/movie/urls.py b/djangoProject2/movie/urls.py index a8b0279b..337d5aef 100644 --- a/djangoProject2/movie/urls.py +++ b/djangoProject2/movie/urls.py @@ -5,11 +5,11 @@ from.import views app_name='movie' -urlpattterns=[ +urlpatterns=[ path('',views.IndexView.as_view(),name='index'), path('hot',views.PopularMovieView.as_view(),name='hot'), path('login',views.LoginView.as_view(),name='login'), - path('logout',views.UserLogout.as_view(),name='logout'), + path('logout',views.UserLogout,name='logout'), path('register',views.RegisterView.as_view(),name='register'), path('tag',views.TagView.as_view(),name='tag'), path('search',views.SearchView.as_view(),name='search'), diff --git a/djangoProject2/movie/views.py b/djangoProject2/movie/views.py index cf0313e0..176db2db 100644 --- a/djangoProject2/movie/views.py +++ b/djangoProject2/movie/views.py @@ -23,11 +23,11 @@ class IndexView(ListView): def get_queryset(self): - return Movie.object.filter(imdb_id__lte=1000) + return Movie.objects.filter(imdb_id__lte=1000) def get_context_data(self,*,object_list=None,**kwargs): - context=super(IndexView,self).get_context_data(*kwargs) + context=super(IndexView,self).get_context_data(**kwargs) paginator=context.get('paginator') page_obj=context.get('page_obj') pagination_data=self.get_pagination_data(paginator,page_obj) @@ -82,7 +82,7 @@ class PopularMovieView(ListView): def get_context_data(self,*,object_list=None,**kwargs): - context=super(PopularMovieView,self).get_context_data(*kwargs) + context=super(PopularMovieView,self).get_context_data(**kwargs) paginator=context.get('paginator') page_obj=context.get('page_obj') pagination_data=self.get_pagination_data(paginator,page_obj) @@ -132,8 +132,7 @@ class TagView(ListView): print(movies) return movies[:100] def get_context_data(self,*,object_list=None,**kwargs): - - context=super(TagView,self).get_context_data(*kwargs) + context=super(TagView,self).get_context_data(**kwargs) if "genre" in self.request.GET.dict().keys(): genre=self.request.GET.dict()['genre'] context.update({'genre':genre}) @@ -177,7 +176,7 @@ class SearchView(ListView): movies=Movie.objects.filter(name__icontains=self.request.GET.dict()['keyword']) return movies def get_context_data(self,*,object_list=None,**kwargs): - context=super(SearchView,self).get_context_data(*kwargs) + context=super(SearchView,self).get_context_data(**kwargs) paginator=context.get('paginator') page_obj=context.get('page_obj') pagination_data=self.get_pagination_data(paginator,page_obj) @@ -252,7 +251,7 @@ class LoginView(View): for error in errors: messages.info(request,error) return redirect(reverse('movie:login')) -class UserLogout(request): +def UserLogout(request): request.session.set_expiry(-1) return redirect(reverse('movie:index')) @@ -269,7 +268,7 @@ class MovieDetailView(DetailView): login=False pk=self.kwargs['pk'] - movie=Movie.object.get(pk=pk) + movie=Movie.objects.get(pk=pk) if login: user=User.objects.get(pk=user_id) rating=Movie_rating.objects.filter(user=user,movie=movie).first() @@ -291,8 +290,8 @@ class MovieDetailView(DetailView): comment=form.cleaned_data.get('comment') user_id=request.session['user_id'] user=User.objects.get(pk=user_id) - movie=Movie.object.get(pk=pk) - rating=Movie_rating.object.filter(user=user,movie=movie).first() + movie=Movie.objects.get(pk=pk) + rating=Movie_rating.objects.filter(user=user,movie=movie).first() if rating: rating.score=score rating.comment=comment @@ -327,7 +326,7 @@ def delete_recode(request,pk): messages.info(request,f'删除{movie.name}评分记录成功!') return redirect(reverse('movie:history',args=(user_id,))) -class recommendMovieView(ListView): +class RecommendMovieView(ListView): model=Movie template_name='movie/recommend.html' paginate_by=15 @@ -348,10 +347,56 @@ class recommendMovieView(ListView): other_users=User.objects.exclude(pk=cur_user_id) self.cur_user_movie_qs=Movie.objects.filter(user=cur_user) for user in other_users: - user_sim_dct[user.id]=len(Movie.object,filter(user=user)&self.cur_user_movie_qs) + user_sim_dct[user.id]=len(Movie.objects.filter(user=user)&self.cur_user_movie_qs) print("user similarity calculated!") return sorted(user_sim_dct.items(),key=lambda x:-x[1][:self.K]) def get_recommend_movie(self,user_lst): movie_val_dct=dict() - for user,_in user_lst: - movie_set=Movie.objects.filter(user=user).exclude(id__in=self.cur_user_movie_qs).annotate(score=F('movie_rating__score')*F('movie_rating__score')) \ No newline at end of file + for user in user_lst: + movie_set=Movie.objects.filter(user=user).exclude(id__in=self.cur_user_movie_qs).annotate(score=Movie('movie_rating__score')*Movie('movie_rating__score')) + for movie in movie_set: + movie_val_dct.setdefault(movie,0) + movie_val_dct[movie]+=movie.score + return sorted(movie_val_dct.items(),key=lambda x:-x[1])[:self.N] + def get_queryset(self): + s=time.time() + user_lst=self.get_user_sim() + movie_lst=self.get_recommend_movie(user_lst) + result_lst=[] + for movie, in movie_lst: + result_lst.append(movie) + e=time.time() + print(f"算法推荐用时:[e-s]秒") + return result_lst + def get_context_data(self,*,object_list=None,**kwargs): + context=super(RecommendMovieView,self).get_context_data(**kwargs) + print(context) + paginator=context.get('pagginator') + page_obj=context.get('page_obj') + pagination_data=self.get_pagination_data(paginator,page_obj) + context.update(pagination_data) + return context + + def get_pagination_data(self,paginator,page_obj,around_count=2): + current_page=page_obj.number + if current_page<=around_count+2: + left_pages=range(1,current_page) + left_has_more=False + else: + left_pages=range(current_page-around_count,current_page) + left_has_more=True + + if current_page>=paginator.num_pages-around_count-1: + right_pages=range(current_page+1,paginator.num_pages+1) + right_has_more=False + else: + right_pages=range(current_page+1,current_page+around_count+1) + right_has_more=True + + return { + 'left_pages':left_pages, + 'right_pages':right_pages, + 'current_page':current_page, + 'left_has__more':left_has_more, + 'right_has__more':right_has_more + } \ No newline at end of file