Django render_to_string Returns NoneType Error
Использование Django Pagination Я пытаюсь сделать бесконечную пагинацию с помощью AJAX. Я последовал примеру, приведенному здесь: https://www.progerhub.com/tutorial/adding-pagination-with-infinite-scroll-in-django/
Мое представление возвращает первую страницу результатов просто отлично, но когда я пытаюсь создать содержимое для дополнительных страниц и вернуть его в виде JSON с помощью render_to_string
, я получаю ошибку при добавлении данных к моей переменной content.
сообщение об ошибке
web_1 | Traceback (most recent call last):
...
web_1 | File "/usr/src/django/media/views.py", line 74, in get
web_1 | content += render_to_string('media_item.html', {'media': media, }, request=request)
...
web_1 | new_obj = func(obj, *arg_vals)
web_1 | File "/usr/local/lib/python3.8/site-packages/django/template/defaultfilters.py", line 784, in divisibleby
web_1 | return int(value) % int(arg) == 0
web_1 | TypeError: int() argument must be a string, a bytes-like object or a number, not 'NoneType'
models.py
class Media(Audit):
title = models.CharField(
max_length=255)
description = models.CharField(
max_length=500,
blank=True,
null=True)
poster = ProcessedImageField(
blank=True,
null=True,
format='JPEG',
options={'quality': 100},
processors=[ResizeToFill(1000, 1500)],
upload_to=get_poster_path)
class Meta:
ordering = (
'title',
'year')
def __str__(self):
return self.title
views.py
class MediaView(LoginRequiredMixin, JsonMixin, View):
def get(self, request, *args, **kwargs):
context = self.get_context_data()
media = models.Media.objects.filter()
page = int(request.GET.get('page', 1))
p = paginator.Paginator(media, 24) # number of media per page
# try to get media for the given page
try:
media_page = p.page(page)
except paginator.EmptyPage:
media_page = paginator.Page([], page, p)
# get initial media list
if not request.is_ajax():
context['media_list'] = media_page
return render(request, 'media.html', context)
# get more media using ajax
else:
content = ''
for media in media_page:
content += render_to_string('media_item.html', {'media': media}, request=request)
data = {
'content': content,
'end_pagination': True if page >= p.num_pages else False,
}
print(data)
return self.render_to_json_response(data)
По-видимому, в моем {'media': media}
что-то не так с render_to_string
, но я не уверен, что именно. Может быть, я что-то упустил из виду?
Вместо:
{% if forloop.counter|divisibleby:2 %}<div class="w-100 d-none d-sm-block d-md-none"><!-- wrap every 3 on sm--></div>{% endif %}
{% if forloop.counter|divisibleby:2 %}<div class="w-100 d-none d-md-block d-lg-none"><!-- wrap every 4 on md--></div>{% endif %}
{% if forloop.counter|divisibleby:4 %}<div class="w-100 d-none d-lg-block d-xl-none"><!-- wrap every 5 on lg--></div>{% endif %}
{% if forloop.counter|divisibleby:6 %}<div class="w-100 d-none d-xl-block"><!-- wrap every 6 on xl--></div>{% endif %}
try:
{% if forloop.counter %}
{% if forloop.counter|divisibleby:2 %}<div class="w-100 d-none d-sm-block d-md-none"><!-- wrap every 3 on sm--></div>{% endif %}
{% if forloop.counter|divisibleby:2 %}<div class="w-100 d-none d-md-block d-lg-none"><!-- wrap every 4 on md--></div>{% endif %}
{% if forloop.counter|divisibleby:4 %}<div class="w-100 d-none d-lg-block d-xl-none"><!-- wrap every 5 on lg--></div>{% endif %}
{% if forloop.counter|divisibleby:6 %}<div class="w-100 d-none d-xl-block"><!-- wrap every 6 on xl--></div>{% endif %}
{% endif %}