Возвращать различные шаблоны из views.py в зависимости от количества загруженных файлов зарегистрированным пользователем - PullRequest
0 голосов
/ 09 июля 2019

Ожидаемое поведение:

У меня есть приложение django, где пользователи загружают «биты» (mp3-файлы), и в конце концов я хочу иметь бесплатный и платный уровни.Уровень бесплатного пользования будет ограничен КОЛИЧЕСТВОМ «битов», которые они могут загрузить.Скажи максимум 3 удара для бесплатных пользователей

Я пытаюсь запустить запрос в моих представлениях, который отправит пользователя на страницу шаблона, требуя, чтобы он стал премиум-участником, если он превысит количество ударов, разрешенных для загрузки.Он должен проверить, кто является вошедшим в систему пользователем, получить количество ударов, загруженных этим пользователем, и, если оно меньше допустимого, показать шаблон загрузки, в противном случае показать шаблон регистрации.

Текущее поведение:

Использование self.request.user дает моему NameError, что self не определено.Я смог заставить код работать, когда жестко запрограммировал идентификатор пользователя в запросе.Вот мой текущий код.

#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 не может найти шаблоны.

Кроме того, кажется, что он работает (только при жестком кодировании идентификатора производителя), если я перезапущу сервер разработки.Поэтому, если для ограничения установлено значение <= 2, которое я ожидаю разрешить для 3 загрузок, я могу продолжать загружать доли в течение всего времени, пока работает сервер разработки.Если я останавливаю сервер и запускаю его снова, меня перенаправляют на шаблон становиться Member.html.</p>

\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)

1 Ответ

0 голосов
/ 09 июля 2019

Вы должны переопределить 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',]
...