首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在许多不同的Django视图中注入相同的上下文?

如何在许多不同的Django视图中注入相同的上下文?
EN

Stack Overflow用户
提问于 2017-06-24 17:34:33
回答 2查看 1.6K关注 0票数 3

我想把关于一个对象的信息放在许多视图中,而不是在每个视图中的get_context_data中重复它。正如你所理解的,我需要一个内部有get_context_data的类,这样我就可以和其他视图混合。在我的示例中,我希望在UpdateAnotherObjectView的上下文中看到‘UpdateAnotherObjectView’:

代码语言:javascript
运行
复制
class BaseObjectInfoView(View):
    def get_context_data(self, **kwargs):
        context_data = super(BaseObjectInfoView, self).get_context_data(**kwargs)
        context_data['some_object'] = SomeObjects.objects.get(pk=1)
        return context_data

class UpdateAnotherObjectView(BaseObjectInfo, UpdateView):
    template_name = 'create_object.html'
    form_class = AnotherObjectForm
    model = AnotherObjects

    def get_context_data(self, **kwargs):
        context_data = super(UpdateAnotherObjectView, self).get_context_data(**kwargs)
        context_data['all_another_objects'] = AnotherObjects.objects.all()
        return context_data

它可以工作,但是get_context_data不是父类'View‘类的一部分。在BaseObjectInfoView中我可能需要更多的特殊类来继承?

或者更好地用另一种方法来构造上下文?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-24 22:33:33

Mixins不需要是视图,但是如果它们具有重写的方法,它会帮助IDE。

上下文由django.views.generic.base.ContextMixin (这个非常方便的网站的详细信息)处理,因此基于类的视图方式如下:

代码语言:javascript
运行
复制
from django.views import generic

class WebsiteCommonMixin(generic.base.ContextMixin):
    page_title = ''
    active_menu = None

    def get_context_data(self, **kwargs):
        context = super(WebsiteCommonMixin, self).get_context_data(**kwargs)
        context.update(dict(page_title=self.page_title, active_menu=self.active_menu))
        return context

class NewsListView(WebsiteCommonMixin, ListView):
    page_title = 'News list'
    active_menu = 'News'
    model = News
    paginate_by = 12

我这样做的许多项目和您必须创建的简单视图,无论如何,是完全声明性。简单地说,我的意思是,它们可以由多个混合体组成,它们都可以在get_queryset、get_context_data或form_valid中做硬的事情。更详细的例子,直接从一个项目:

代码语言:javascript
运行
复制
class FeedbackMixin(object):
    message = 'Well Done!'

    def __init__(self):
        self._message_kwargs = {}
        super().__init__()

    def add_message_kwarg(self, name, value) -> None:
        self._message_kwargs[name] = value

    def format_message(self, kwargs) -> str:
        return self.message.format(**kwargs)

    def generate_message(self) -> None:
        msg = self.format_message(self._message_kwargs)
        messages.success(getattr(self, 'request'), msg)


class ModelFeedbackMixin(FeedbackMixin, generic.edit.ModelFormMixin):
    success_view_name = None
    success_url_kwargs = None

    def get_success_url_kwargs(self):
        return self.success_url_kwargs

    def get_success_url(self) -> str:
        success_url_kwargs = self.get_success_url_kwargs()
        if not self.success_view_name:
            url = super().get_success_url()
        elif success_url_kwargs is not None:
            url = reverse(self.success_view_name, kwargs=success_url_kwargs)
        else:
            if hasattr(self.object, 'slug'):
                url_kwargs = {'slug': self.object.slug}
            else:
                url_kwargs = {'pk': self.object.pk}
            url = reverse(self.success_view_name, kwargs=url_kwargs)
        return url

    def form_valid(self, form):
        response = super().form_valid(form)
        self.generate_message()
        return response
票数 7
EN

Stack Overflow用户

发布于 2017-06-24 22:16:16

也许这样更容易读懂..。

代码语言:javascript
运行
复制
def add_context(func):
# this is a wrapper function
    def wrapper(*args, **kwargs):
        context_data = func(*args, **kwargs)
        context_data['some_object'] = SomeObjects.objects.get(pk=1)
        return context_data
return wrapper


class UpdateAnotherObjectView(BaseObjectInfo, UpdateView):
    template_name = 'create_object.html'
    form_class = AnotherObjectForm
    model = AnotherObjects

    @add_context
    def get_context_data(self, **kwargs):
        kwargs['all_another_objects'] = AnotherObjects.objects.all()
        return kwargs
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44739145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档