首页 > 解决方案 > 根据登录用户上传的文件数从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)

标签: pythondjangotemplatesdjango-queryset

解决方案


您应该覆盖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',]

推荐阅读