gpt4 book ai didi

jquery - 使用当前用户 ID 的 Django 通用 ListView 过滤器

转载 作者:行者123 更新时间:2023-12-05 06:44:26 26 4
gpt4 key购买 nike

我正在创建一个相当简单的网络应用程序,它可以让我对各种项目进行评分(希望用于生成一些机器学习建议)。

我通过使用 Django-ratings 获得了 5 星评级,但是,我在为我的“评级项目”创建新 View 时遇到困难。更具体地说:我在尝试创建“未评级项目” View 和“先前评级项目” View 时陷入困境。

djangoratings 通过创建使用以下模型来管理投票来工作:

class Vote(models.Model):
content_type = models.ForeignKey(ContentType, related_name="votes")
object_id = models.PositiveIntegerField()
key = models.CharField(max_length=32)
score = models.IntegerField()
user = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name="votes")
ip_address = models.IPAddressField()
cookie = models.CharField(max_length=32, blank=True, null=True)
date_added = models.DateTimeField(default=now, editable=False)
date_changed = models.DateTimeField(default=now, editable=False)

class ContentType(models.Model):
name = models.CharField(max_length=100)
app_label = models.CharField(max_length=100)
model = models.CharField(_('python model class name'), max_length=100)
objects = ContentTypeManager()

我正在评分的项目(models.py):

class Media(models.Model):
id = models.AutoField(primary_key=True)
url = models.CharField(unique=True, max_length=100)
last_updated = models.DateTimeField(blank=True, null=True)
...
rating = RatingField(range=5, can_change_vote=True, allow_delete=True) # 5 possible rating values, 1-5
class Meta:
verbose_name_plural = "Media"

下面的 View 通过分页并允许我对每个项目进行评分,效果很好:

class MediaListView(LoginRequiredMixin, ListView):
queryset = Media.objects.all()
template_name = 'myMedia/media_list.html'
paginate_by = 10

但是,我正在寻找一种以两种方式过滤这些项目的方法:

  • 仅检索按评级日期 (DESC) 排序的评级 View
  • 只检索未评级的 View ,而不是(现在,也许以后!)排序。

我想我需要查询投票表(过滤当前用户)才能这样做。由于除了“媒体”评级外我没有其他任何东西,所以我可以忽略通用评级表的“content_type”方面(它处理不同类型的模型被评级)。

我看到 request.user在与识别当前用户相关的问题中经常提到。但是,我在尝试这样做时收到“NameError:名称‘request’未定义”错误:

#views.py
class MediaListView(LoginRequiredMixin, ListView):
queryset = Media.objects.all()
template_name = 'myMedia/media_list.html'
paginate_by = 10

class MediaListView_VotesByUser(LoginRequiredMixin, ListView):
User = request.user
voted_ids = Vote.objects.filter(user=User).values('object_id', flat=True) # Obtain the IDs for voted items.
queryset = Media.objects.filter(id__in=voted_ids])
paginate_by = 10

class MediaListView_Unrated(LoginRequiredMixin, ListView):
User = request.user
voted_ids = Vote.objects.filter(user=User).values('object_id', flat=True) # Obtain the IDs for voted items.
queryset = Media.objects.exclude(id__in=voted_ids])
paginate_by = 10


# urls.py
urlpatterns = patterns('',
url(
regex=r'^$',
view=views.MediaListView.as_view(),
name='media'),
url(r'^rate/(?P<object_id>\d+)/(?P<score>\d+)/', AddRatingFromModel(), {
'app_label': 'myMedia',
'model': 'media',
'field_name': 'rating',
}),
url(
regex=r'^myVotes',
view=views.MediaListView_VotesByUser.as_view(),
name='UserVotedOn'),
url(
regex=r'^unrated',
view=views.MediaListView_Unrated.as_view(),
name='UnratedMedia')

)

此外,我不太确定我正朝着正确的方向前进。我是否需要为此单独查看或扩展现有 View ?非常感谢有关我如何创建这些 View 的任何帮助或提示。如果重要的话,我正在使用 Django 1.7(使用 MySQL)。

最佳答案

好吧,所以在谷歌搜索我的问题标题时,我实际上 stumbled(!)在回答问题后,请注意我确实用谷歌搜索了很长一段时间!我想是时候再次回顾所有文档了!

Django documentation: As you can see, it’s quite easy to add more logic to the queryset selection; if we wanted, we could use self.request.user to filter using the current user, or other more complex logic.

以下 View 返回我所有的投票:

class MediaListView_VotesByUser(LoginRequiredMixin, ListView):
def get_queryset(self):
voted_ids = Vote.objects.filter(user=self.request.user).values_list('object_id', flat=True)
return Media.objects.filter(id__in=voted_ids)
paginate_by = 10

下面返回未评级的。

class MediaListView_Unrated(LoginRequiredMixin, ListView):
def get_queryset(self):
voted_ids = Vote.objects.filter(user=self.request.user).values_list('object_id', flat=True)
return Media.objects.exclude(id__in=voted_ids)
paginate_by = 10

关于更好地实现此类功能的性能和/或设计技巧仍然会受到赞赏!

关于jquery - 使用当前用户 ID 的 Django 通用 ListView 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28882837/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com