Запутался, как использовать select_related или SelectRelatedMixin

0
class Board(models.Model):
    author = models.ForeignKey(User, unique=False, on_delete=models.CASCADE)
    create_date = models.DateField(auto_now=False, auto_now_add=True)

    def __str__(self):
        return F'{self.author.username} {self.create_date} {self.pk}'


class Problem(models.Model):
    board = models.ForeignKey(Board, unique=False, on_delete=models.CASCADE)
    problem = models.TextField()

    def __str__(self):
        return self.problem[:30]

    def get_absolute_url(self):
        return 

Идея заключается в том, что у меня есть Совет, а затем несколько связанных с ним проблем.

Я хочу создать шаблон classView + для детализации одной доски. как /board/187

Результат будет выглядеть так:

  • СОВЕТ: Проблемы с ИТ проблемами:

    1) Старые серверы

    2) Нет СКП

    3) Статические выбросы

Я создал классный подход для создания Правления. Моя идея состояла в том, что у board_detail.html был бы тег {{ include "board/_problem.html" }}, который затем использовал бы производную ListView для перечисления всей Problem связанной с этим Board.

Я не очень ясно понял, как это сделать. Я думал, что могу использовать SelectRelatedMixin в классе "Проблема", чтобы затем я мог получить доступ к полям в шаблоне, что-то вроде for problem in board.problems. Но это, похоже, не работает. (SelectRelatedMixin происходит из django-braces)

Я туман на том, как эта работа должна быть объединена. На самом деле, я даже не уверен, как это сделать с помощью исходного select_related(). Думаю, я должен был бы знать, как это сделать с реальностью, чтобы иметь полное понимание.

Вот два cbv, которые я сделал в своей попытке.

class Problem(models.Model):
    board = models.ForeignKey(Board, unique=False, on_delete=models.CASCADE)
    problem = models.TextField()

    def __str__(self):
        return self.problem[:30]

    def get_absolute_url(self):
        return

class BoardUpdateView(SelectRelatedMixin, UpdateView):
    model = Board
    fields = ['author']
    select_related = (Problem,)

    def get_object(self, queryset=None):
        if "pk" not in self.kwargs:
            self.kwargs['pk'] = None
        obj, created = Board.objects.get_or_create(pk=self.kwargs['pk'],
                                                       defaults={'author': self.request.user})
        return obj  

Но, возможно, это совершенно неправильный подход. Вместо этого, возможно, я должен каким-то образом передать Board.pk включенному ProblemList.html чтобы он мог генерировать список соответствующих объектов таким образом?

  • 0
    Если неясно, как решить какую-либо задачу с помощью общих представлений на основе классов, я бы рекомендовал вместо этого написать представление на основе функций. Обычно это приводит к более понятному и понятному коду. Переопределение CBV трудно без хорошего знания обширного дерева наследования.
  • 0
    Я думаю, что мое дело - очень типичная вещь, просто у меня нет опыта с Джанго.
Показать ещё 2 комментария
Теги:

1 ответ

-1

def get_context_data (self, ** kwargs): context = super (CompleteView, self).get_context_data (** kwargs)

board = self.get_object()
# print(F"problem is what? {problem}")
context['problems'] = board.problem_set.all().order_by('pk')

return context

get_object() внутри get_context_data.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню