在 Django 中的视图之间共享上下文?

Posted

技术标签:

【中文标题】在 Django 中的视图之间共享上下文?【英文标题】:Share context between views in Django? 【发布时间】:2016-04-13 20:43:54 【问题描述】:

对于非常相似的视图和模板,我有 3 个视图。

我的代码变得重复,它似乎没有遵循 Django DRY 方法。

Views.py

@login_required
def registrations_check1_detail(request, registration_pk):

    registration = get_object_or_404(Registration, pk=registration_pk)

    costumer_profile_form = forms.CostumerProfileForm()

    # THIS CONTEXT IS REPEATED ACROSS  MANY OF MY VIEWS
    request_context = 
        'registration': registration,
        'status': Registration.STATUS_CHOICES,
        'costumer_profile_form': costumer_profile_form,
        'duration_form':  pf.DurationForm(),
        'REG_DURATION_CHOICES'  : Duration.REG_DURATION_CHOICES,
        'EXT_DURATION_CHOICES'  : Duration.EXT_DURATION_CHOICES,
        'is_editable': editable_fields_perm(request.user, registration)
    

    return render(request, 'profiles/registrations_check1_detail.html', request_context)

@login_required
def finance_review_detail(request, registration_pk):

    costumer_profile_form = forms.CostumerProfileForm()

    registration = get_object_or_404(Registration, pk=registration_pk)

    request_context = 
        'registration': registration,
        'costumer_profile_form': costumer_profile_form,
        'duration_form':  pf.DurationForm(),
        'REG_DURATION_CHOICES'  : Duration.REG_DURATION_CHOICES,
        'EXT_DURATION_CHOICES'  : Duration.EXT_DURATION_CHOICES,
        'is_editable': editable_fields_perm(request.user, registration)
    

    return render(request, 'profiles/finance_review_detail.html', request_context)

处理这个问题的正确方法是什么?

编辑

按照尚旺的建议,现在是这样的:

@login_required
def registration_detail(request, registration_pk):

    request_context = _registration_context(registration_pk, request.user)

    return render(request, 'profiles/registration_detail.html', request_context)

【问题讨论】:

有基于类的视图,可以有一个通用视图,然后将其子类化或使用 mixins docs.djangoproject.com/en/1.9/topics/class-based-views/intro 【参考方案1】:

这很正常,但解决方案真的很简单,您可以将它们提取到一个函数中,并且只传递它需要产生结果的参数,例如costumer_profile_formregistration 在这种情况下。然后你调用这个函数,应该就是它了。

【讨论】:

以上是关于在 Django 中的视图之间共享上下文?的主要内容,如果未能解决你的问题,请参考以下文章

在Javascript HTML中访问Django视图中的上下文变量(列表)[重复]

Django - 视图中的上下文处理器?

Django通用视图中get_context_data和queryset之间的区别?

在 Tomcat 中的上下文之间共享会话数据

我可以通过 django 视图访问装饰器中的上下文对象吗

如何在多个库之间共享上下文?