混淆了如何使用select_related或SelectRelatedMixin

时间:2017-09-09 10:58:42

标签: django

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

输出如下:

  • 董事会:IT问题:

    1)旧服务器

    2)没有UPC

    3)静电放电

我制作了一个基于类的视图来生成Board。我的想法是,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,以便它可以通过这种方式创建适当对象的列表?

1 个答案:

答案 0 :(得分:-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就是答案。