如何在django中使用与两个CBV相同的模板?

时间:2015-11-12 17:20:55

标签: django templates

我在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或者如果request.path == url检查它 但代码没有效果。 如何检查在当前时间使用模板的视图并更改此视图的模板中的块文本?

1 个答案:

答案 0 :(得分:2)

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

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

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

{% 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