Как получить доступ к количеству объектов в шаблоне с помощью менеджера моделей? - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть модель, которая создает Memo объектов.Я хотел бы использовать метод posted пользовательского Диспетчера моделей, чтобы вернуть общее количество объектов Memo - затем использовать это число в шаблоне .Я пытаюсь сохранить как можно больше своего кода в моих моделях и менеджерах моделей, а меньше - в своих представлениях, поскольку я читал, что это было наилучшей практикой в ​​«Два совка Джанго».

В оболочке, которую яможно получить количество записок как таковое:

>>> from memos.models import Memo
>>> Memo.objects.all()
<QuerySet [<Memo: Test Memo 2>, <Memo: Test Memo 1>]>
>>> Memo.objects.all().count()
2

Вот так выглядит мой Менеджер моделей и моделей:

class MemoManager(models.Manager):

    use_for_related_fields = True

    def posted(self):
        return self.count()


class Memo(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    date_time = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    objects = MemoManager()

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('memos-detail', kwargs={'pk': self.pk})

Я знаю, что это явно неправильный способ сделать это, ноЯ запутался здесь.Итак, как мне использовать Диспетчер моделей, чтобы получить количество объектов и использовать его в шаблоне, например: {{ objects.all.count }}?

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

1 Ответ

1 голос
/ 28 сентября 2019

Извините, но вы неверно истолковали то, что было написано в TSD.Жирная модель Lean View предназначена для того, чтобы исключить код, относящийся к «бизнес-логике», из представлений и некоторых специфических для модели вещей.Запрос должен быть обработан представлением.Поэтому, когда вы хотите загрузить шаблон, вы должны сначала получить запрос GET к вашему приложению.

Функция представления должна быть написана так, чтобы проверка данных POST или создание нового объекта в БД или Querying /Фильтрация запросов GET должна обрабатываться в соответствующем менеджере сериализатора / модели / модели.

Что должно происходить, когда вы хотите загрузить шаблон.

  1. У вас есть URL для шаблонакоторые вы создали, и отображенная для него функция просмотра
  2. В функции просмотра вы должны визуализировать указанный шаблон и передать необходимые данные внутри контекста.
  3. Чтобы соответствовать Lean View FatСтиль модели, если вы хотите получить Queryset из Memo, но только те, для которых для полей is_deleted установлено значение False, вы можете перезаписать метод get_queryset () менеджера модели для модели Memo.
  4. Если вы хотите создатьновое Memo с запросом POST, вы можете обработать создание, используя ModelForm!

Надеюсь, что это очищает этоngs up!

РЕДАКТИРОВАТЬ: Как передать контекст в шаблон, в вашем случае счетчик напоминаний.

def random_memo_view(request):
    context = {'memo_count': Memo.posted()}
    return render(request, 'template.html', context=context)

RE-EDIT Я только что проверил, что вы используете DetailView.В этом случае следуйте этому из Django Docs. Представления на основе классов: добавление дополнительного контекста

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...