如何在许多不同的Django视图中注入相同的上下文? [英] How to inject same context in many different Django views?

查看:81
本文介绍了如何在许多不同的Django视图中注入相同的上下文?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在一个视图中放置一个对象的信息,而不必在每个视图的get_context_data中重复它.据您了解,我需要一个带有get_context_data的类,可以将其与其他视图混合使用. 在我的示例中,我想在UpdateAnotherObjectView的上下文中看到"some_object":

I want to put info about one object in many views without repeating it in get_context_data in each view. As u understand i need a class with get_context_data inside, that i can mix with other views. Here in my example i want to see 'some_object' in context of UpdateAnotherObjectView:

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不是父级视图"类的一部分.可能我需要更多特殊的类从BaseObjectInfoView中继承吗?

it works, but get_context_data is not a part of parent 'View' class. May be i need more special class to inherit from in BaseObjectInfoView?

还是用另一种方法构造上下文可能更好?

or maybe better to construct context with another method ?

推荐答案

Mixin不必是视图,但是如果IDE具有重写的方法,则可以帮助IDE.

Mixins don't need to be views, but it helps IDE's if they have the methods they're overriding.

上下文由django.views.generic.base.ContextMixin处理(有关非常方便的网站),因此基于类的视图处理方式将是这样:

Contexts are handled by django.views.generic.base.ContextMixin (details on this very handy site), So the class-based views way of things would be this:

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中做硬性工作.直接来自项目的更详细的示例:

I do this for many projects and the simple views you have to create anyway, are fully declarative. And by simple, I mean that they can consist of mulitple mixins, all doing the hard stuff in either get_queryset, get_context_data or form_valid. More elaborate example, straight from a project:

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

这篇关于如何在许多不同的Django视图中注入相同的上下文?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆