Ожидаемое поведение:
У меня есть приложение 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)