【问题标题】:How to use the same template with two CBVs in django?如何在 django 中使用相同的模板和两个 CBV?
【发布时间】:2016-02-14 03:10:23
【问题描述】:

我在 django 中有两个 CBV

class StudentUpdateView(UpdateView):
model = Student
template_name = "students/students_edit.html"
form_class = StudentUpdateForm

def get_success_url(self):
    return u'%s?status_message=Студент успішно збережений ' % reverse('home')

def post(self, request, *arg, **kwargs):
    if request.POST.get('cancel_button'):
        messages.info(self.request, "Edit canceled")
        return HttpResponseRedirect(
            u'%s?status_message=Редагування відмінено'
            % reverse('home'))
    else:
        messages.success(self.request, u"Студент змінений") 
        return super(StudentUpdateView, self).post(
            request,*arg, **kwargs)
def get_context_data(self, **kwargs):
    context = super(StudentUpdateView, self).get_context_data(**kwargs)
    return context

另一个是相同的模型,但 CreateView。我想为这两个视图使用相同的模板,并且模板中的某些部分我希望是动态的。

{% block meta_title %}Редагувати студента{% endblock meta_title %} {% block title %}Редагувати студента{% endblock title %}

元标题放置元文本,标题带来页面 H2 文本。我想根据我的观点更改此块中的文本(如果我输入 createview,那么文本将更改为一些,如果另一个 - 模板更改为另一个文本) 我试图通过 ifequal 或 if request.path == url 检查它 但代码没有效果。 如何检查当前时间使用模板的视图并更改该视图模板中的块文本?

【问题讨论】:

    标签: django templates


    【解决方案1】:

    您应该从视图向同一个模板发送不同的上下文。

    假设您有两个使用相同模板的 url(/test1/ 和 /test2/),与 url 关联的不同视图可以将不同的上下文对象发送到同一模板以更改内容。

    因此,在您的情况下,您可以按如下方式编辑模板 -

    {% block meta_title %}{{some_variable}}{% endblock meta_title %} 
    {% block title %}{{some_other_variable}}{% endblock title %}
    

    您可以在此处发送上下文对象中变量的不同值。

    例如——

    views.py

    from django.views.generic import FormView, TemplateView
    from  .forms import TestForm
    
    class TestView1(TemplateView):
        template_name = 'test2.html'
    
        def get_context_data(self, **kwargs):
            context = super(TestView1, self).get_context_data(**kwargs)
            context['title'] = 'Bansal'
            return context
    
    
    class TestView2(TemplateView):
        template_name = 'test2.html'
    
        def get_context_data(self, **kwargs):
            context = super(TestView2, self).get_context_data(**kwargs)
            context['title'] = 'Utkarsh'
            return context
    

    urls.py

    from django.conf.urls import url
    from .views import RegisterView, TestView1, TestView2
    
    urlpatterns = [
        # url(r'', RegisterView.as_view()),
        url(r'^test1$', TestView1.as_view()),
        url(r'^test2$', TestView2.as_view()),
    ]
    

    test2.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>{{ title }}</title>
    </head>
    <body>
    {{ title }}
    </body>
    </html>
    

    这里注意两个模板视图都使用同一个模板——test2.html,唯一的区别是不同的上下文值是从不同的视图传递过来的。

    所以当我们打开 test1/ 我们看到 Bansal 而在 test2/ 我们看到 Utkarsh

    【讨论】:

    • 如何在 cbv 端使用这个?
    • 我应该添加一个工作示例吗?您基本上需要覆盖 CBV 中的 get_context_data 方法。
    • 是的,请。我现在阅读 ccbv 网站并没有得到:你如何将这些 var 放在上下文中
    猜你喜欢
    • 2013-05-30
    • 2012-07-01
    • 2019-12-22
    • 2017-09-24
    • 2015-04-03
    • 1970-01-01
    • 2018-10-31
    • 2011-12-20
    • 1970-01-01
    相关资源
    最近更新 更多