控制在Django中查看和模板输出的请求

时间:2019-05-19 12:30:24

标签: python django django-views django-urls django-2.0

此视图用于获取EducationalRecord模型中的所有记录:

def all_education_resume(request):
    RESUME_INFO['view'] = 'education'
    educations_resume = EducationalRecord.objects.all().order_by('-created_date')
    template = 'resumes/all_resume.html'
    context = {'educations_resume': educations_resume, 'resume_info': RESUME_INFO}
    return render(request, template, context)

现在,如果我想为其他模型(例如工作履历,研究履历等)准确地编写此视图, 我必须另外一个观点。  我的问题是:

  

如何获取所有这些请求的视图,因此请先检查以下网址   请求,然后进行相关查询?如何控制网址   我认为有要求吗?

我的其他问题与我的第一个问题完全相同,只是有所不同:

  必须在特定模板中呈现的

控件视图。   第二个问题是模板和视图之间的比例是   视图与url的比例或如何创建模板   多个视图(例如,用于各种数据库简历   简历,我有一个模板),然后根据所呈现的视图,   模板输出是不同的。

我已经实现了以下两个问题:

  1. 我为每个请求写了一个视图!
  2. 在每个视图中,我设置RESUME_INFO['view']的值,然后在模板页面中对其进行检查并指定了相应的模板。

这两个问题的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:1)

  

如何获得所有这些请求的视图,因此首先检查请求的URL,然后进行相关查询?如何在我的视图中控制URL请求?

您可以访问request.path,也可以让url(..)传递带有kwargs的参数,该参数例如包含对模型的引用,但这通常是不好的设计。通常,如果使用不同的模型,则可能还必须对这些模型进行排序,对它们进行不同的过滤,对它们进行不同的渲染等。如果不这样,则通常表明建模存在问题。

不过,您可以使用class-based views [Django-doc]来删除尽可能多的样板。您的视图看起来像ListView [Django-doc],通过使用这种视图并在必要时进行修补,我们可以省略大多数“ 样板”代码:

# app/views.py

from django.views.generic.list import ListView

class MyBaseListView(ListView):
    resume_info = None
    template = 'resumes/all_resume.html'

    def get_context_data(self, *args, **kwargs):
        context = super().get_context_data(*args, **kwargs)
        context['resume_info'] = {'view': self.resume_info}
        return context

然后在各个列表视图中,只需指定resume_infomodelqueryset即可使用'all_resume.html'模板进行渲染,例如:

# app/views.py

# ...

class EducationalResumeView(MyBaseListView):
    queryset = EducationalRecord.objects.order_by('-created_date')
    resume_info = 'education'

class OtherModelView(MyBaseListView):
    model = OtherModel
    resume_info = 'other_info'

因此,我们在这里可以仅使用一次继承来定义公共事物,并在多个视图中使用它。如果需要在特定视图中更改某些内容,可以在该级别进行覆盖。

urls.py中,您可以使用.as_view() method [Django-doc]定义这种视图。例如:

# app/urls.py

from django.urls import path
from app.views import EducationalResumeView, OtherModelView

urlpatterns = [
    path('education/', EducationalResumeView.as_view()),
    path('other/', OtherModelView.as_view()),
]