0

我使用基于类的视图来更新我的模型:

class BlogUpdateView(UpdateView):
    model=Blog

    def get_context_data(self, **kwargs):
        context = super(BlogUpdateView, self).get_context_data(**kwargs)
        context['author'] = get_object_or_404(User,
            username__iexact=self.kwargs['username'])
        return context

我想遵循 DRY 原则,避免get_context_data在每个视图函数中重复。这个问题几乎和这个问题一样。依靠@Jj给出的答案,我想我的班级看起来像这样:

class BlogMixin(object):
    def get_author(self):
      # How to get author?
      return author

    def get_context_data(self, **kwargs):
      context = super(BlogMixin, self).get_context_data(**kwargs)
      context['author'] = self.get_author()
      return context

我的问题是:如何访问 mixin 类中的对象?

更新

答案在 mongoose_za 评论中给出。我可以通过这一行获得作者:

author = User.objects.get(username__iexact=self.kwargs['username'])
4

1 回答 1

1

你的遗嘱是这样的:

class BlogMixin(object):
    def get_author(self):
      # How to get author?
      # Assuming user is logged in. If not you must create him
      author = self.request.user
      return author

class BlogUpdateView(BlogMixin, UpdateView):
    model=Blog

    def get_context_data(self, **kwargs):
        context = super(BlogUpdateView, self).get_context_data(**kwargs)
        context['author'] = self.get_author()
        return context

当你这样做时context = super(BlogUpdateView, self).get_context_data(**kwargs)上下文将成为你的对象。


首先,您将 mixin 添加到类构造函数中。

正如你在这里看到的:

class BlogUpdateView(BlogMixin, UpdateView):

现在,您的 BlogMixin mixindef get_context_data(self, **kwargs):将覆盖基础。def get_context_data(self, **kwargs):

但是您还指定了 adef get_context_data(self, **kwargs):在您class BlogUpdateView(UpdateView):的最后,这是get_context_data将生效的。

Mixins 很难掌握。我觉得最好通过查看其他人的示例来学习。看看这里

编辑:意识到也许我没有正确回答您的问题。如果你想访问你的 mixin 中的一个对象,你必须将它传入。例如,我会将 context 对象传递给 mixin:

class BlogMixin(object):
    def get_author(self, context):
      # This is how to get author object
      author = User.objects.get(username__iexact=self.kwargs['username'])
      return context

class BlogUpdateView(BlogMixin, UpdateView):
    model=Blog

    def get_context_data(self, **kwargs):
        context = super(BlogUpdateView, self).get_context_data(**kwargs)
        return self.get_author(context)

代码未经测试,但想法应该是正确的

于 2012-06-28T12:10:37.830 回答