Django: представление списка не распознано
Мне нужно сделать проект объявлений для Coursera. По сути, каждый пользователь может размещать, обновлять и удалять объявления. Проблема в том, что даже если объекты хранятся правильно (я проверил таблицы и объекты через администратора и вручную с помощью командной строки), список объявлений не отображается, и он говорит "В базе данных нет объявлений.", хотя объявления есть. Я ищу везде, но не могу найти ошибку. Вот код, или альтернативная ссылка на репозиторий: https://github.com/materialAres/django_for_everybody_apps
views.py:
from ads.models import Ad
from ads.owner import OwnerListView, OwnerDetailView, OwnerCreateView, OwnerUpdateView, OwnerDeleteView
class AdListView(OwnerListView):
model = Ad
class AdDetailView(OwnerDetailView):
model = Ad
class AdCreateView(OwnerCreateView):
model = Ad
fields = ['title', 'text', 'price']
class AdUpdateView(OwnerUpdateView):
model = Ad
fields = ['title', 'text', 'price']
class AdDeleteView(OwnerDeleteView):
model = Ad
owner.py:
from django.views.generic import CreateView, UpdateView, DeleteView, ListView, DetailView
from django.contrib.auth.mixins import LoginRequiredMixin
class OwnerListView(ListView):
"""
Sub-class the ListView to pass the request to the form.
"""
class OwnerDetailView(DetailView):
"""
Sub-class the DetailView to pass the request to the form.
"""
class OwnerCreateView(LoginRequiredMixin, CreateView):
"""
Sub-class of the CreateView to automatically pass the Request to the Form
and add the owner to the saved object.
"""
# Saves the form instance, sets the current object for the view, and redirects to get_success_url().
def form_valid(self, form):
print('form_valid called')
object = form.save(commit=False)
object.owner = self.request.user
object.save()
return super(OwnerCreateView, self).form_valid(form)
class OwnerUpdateView(LoginRequiredMixin, UpdateView):
"""
Sub-class the UpdateView to pass the request to the form and limit the
queryset to the requesting user.
"""
def get_queryset(self):
print('update get_queryset called')
""" Limit a User to only modifying their own data. """
qs = super(OwnerUpdateView, self).get_queryset()
return qs.filter(owner=self.request.user)
class OwnerDeleteView(LoginRequiredMixin, DeleteView):
"""
Sub-class the DeleteView to restrict a User from deleting other
user's data.
"""
def get_queryset(self):
print('delete get_queryset called')
qs = super(OwnerDeleteView, self).get_queryset()
return qs.filter(owner=self.request.user)
models.py:
from django.db import models
from django.core.validators import MinLengthValidator
from django.conf import settings
class Ad(models.Model) :
title = models.CharField(
max_length=200,
validators=[MinLengthValidator(2, "Title must be greater than 2 characters")]
)
price = models.DecimalField(max_digits=7, decimal_places=2, null=True)
text = models.TextField()
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
# Shows up in the admin list
def __str__(self):
return self.title
Если вам нужно что-то еще, дайте мне знать. Код изначально был запущен на pythonanywhere.com; я загрузил его на свой ПК, но ничего не изменилось. Заранее спасибо!
Вы должны добавить context_object_name
к вашему ListView или использовать имя объекта по умолчанию object_list
в шаблоне.
Если вы установите имя_объекта контекста = "ad_list", ваш шаблон распознает данные. если нет, вам придется использовать имя по умолчанию.
class AdListView(OwnerListView):
model = Ad
context_object_name = "ad_list"