python - 根据登录用户上传的文件数从views.py返回不同的模板
问题描述
预期行为:
我有一个 django 应用程序,用户可以在其中上传“beats”(mp3 文件),我最终想要一个免费层和一个付费层。免费套餐将限制在他们能够上传的“节拍”数量内。说免费用户最多 3 拍。
我正在尝试在我的视图中运行一个查询,该查询会将用户发送到一个模板页面,如果他们超过允许上传的节拍数量,则要求他们成为高级会员。它应该检查谁是登录用户,获取该用户上传的节拍计数,如果小于允许,则显示上传模板,否则显示注册模板。
当前行为:
使用 self.request.user 给我的 NameError 自我未定义。在将用户 ID 硬编码到查询中时,我能够使代码正常工作。这是我当前的代码。
#beatupload/views.py
class UploadView(ListView):
model = beat
template_name = 'uploads.html'
def get_queryset(self):
return beat.objects.filter(producer=self.request.user)
class uploadNew(CreateView): # new
model = beat
fields = ['title', 'beat']
success_url = reverse_lazy('uploads')
#Check number of beats uploaded by user and if exceeds amount require signup
#To render sign up template if true and proceed to upload if false
def get_queryset():
return beat.objects.filter(producer_id="3")
if get_queryset().count() <= 2:
template_name = 'uploadNew.html'
else:
template_name = 'becomeMember.html'
#END CHECK
def form_valid(self, form):
form.instance.producer = self.request.user
return super(uploadNew, self).form_valid(form)
# beatupload/models.py
from django.conf import settings
from django.db import models
class beat(models.Model):
title = models.CharField(max_length=50)
beat = models.FileField(upload_to='beats/')
producer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
def __str__(self):
return self.title
如果您在上面的 ListView 类中看到,则成功仅列出登录用户上传的节拍。尝试修改该代码并获得计数是行不通的,因为我得到一个“自我”未定义错误。例如:
class uploadNew(CreateView): # new
model = beat
fields = ['title', 'beat']
success_url = reverse_lazy('uploads')
#Check number of beats uploaded by user and if exceeds amount require signup
#To render sign up template if true and proceed to upload if false
def get_queryset(self):
return beat.objects.filter(producer=self.request.user)
if get_queryset(self).count() <= 2: ###ERROR COMES FROM HERE###
template_name = 'uploadNew.html'
else:
template_name = 'becomeMember.html'
#END CHECK
def form_valid(self, form):
form.instance.producer = self.request.user
return super(uploadNew, self).form_valid(form)
如前所述,我在代码的 if 语句部分收到名称错误。
如果我将 if 语句缩进为函数的一部分,如下所示:
class uploadNew(CreateView): # new
model = beat
fields = ['title', 'beat']
success_url = reverse_lazy('uploads')
#Check number of beats uploaded by user and if exceeds amount require signup
#To render sign up template if true and proceed to upload if false
def get_queryset(self):
return beat.objects.filter(producer=self.request.user)
if get_queryset(self).count() <= 2:
template_name = 'uploadNew.html'
else:
template_name = 'becomeMember.html'
#END CHECK
def form_valid(self, form):
form.instance.producer = self.request.user
return super(uploadNew, self).form_valid(form)
我没有收到错误,但 django 找不到模板。
此外,如果我重新启动开发服务器,它似乎只能工作(当硬编码生产者的 ID 时)。因此,如果限制设置为 <= 2,我希望允许 3 次上传,只要开发服务器正在运行,我就可以继续上传节拍。如果我停止服务器并重新启动它,我将被重定向到模板 becomeMember.html。
\views.py", line 27, in uploadNew
if get_queryset(self).count() <= 2:
NameError: name 'self' is not defined
那就是名字错误。
这是模板错误:
Django tried loading these templates, in this order:
Using engine django:
django.template.loaders.filesystem.Loader: C:\Users\Alex.INACOM-SBY\Documents\code\theBeatStore\agBeatStoreRoot\templates\beatupload\beat_form.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Users\Alex.INACOM-SBY\Documents\code\env\lib\site-packages\django\contrib\admin\templates\beatupload\beat_form.html (Source does not exist)
django.template.loaders.app_directories.Loader: C:\Users\Alex.INACOM-SBY\Documents\code\env\lib\site-packages\django\contrib\auth\templates\beatupload\beat_form.html (Source does not exist)
解决方案
您应该覆盖get_template_names
方法,如下所示:
def get_template_names(self):
if beat.objects.filter(producer=self.request.user).count() <= 2:
return ['uploadNew.html',]
else:
return ['becomeMember.html',]
推荐阅读
- java - 在java中使用hashmap检查ip地址(用户输入)的重复值
- javascript - 角度转换日期数组
- python - 在python中获取韩文字符串
- ruby-on-rails - 没有路由匹配 [GET] "/javascripts/active_admin.js
- java - 如何将 Firebase 图像检索到 ImageView?
- logic - 基于布尔值返回现有数组或空数组的 Azure ADF 表达式
- python - 使用 pysftp 拆分 SFTP 目录中的文本文件
- android - io.FileNotFoundException:打开失败:EACCES(权限被拒绝)
- python - 使用 Python 在列表中查找相似元素
- curl - 如何让 gitlab api 列出我的项目的版本?