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

Posted

技术标签:

【中文标题】在 django 中控制查看和模板输出的请求【英文标题】:Control requests to view and template output in django 【发布时间】:2019-10-06 01:13:12 【问题描述】:

这是获取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 在我看来请求?

我的另一个问题和我的第一个问题完全一样,不同之处在于:

必须在特定模板中呈现的控件视图。换句话说,在 第二个问题模板和视图之间的比例改为 视图与 url 的比例或如何创建模板 多个视图(例如,用于各种数据库的简历 简历,我有一个模板)然后,取决于哪个视图渲染, 模板输出不同。

我对这两个问题的实现如下:

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

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

【问题讨论】:

你可以看到request.path,但是用同一个视图处理所有这些任务根本不是一个好主意。但是,您可以使用 cbv ListView 来删除大部分样板代码。 但是所有这些任务都是一样的!他们所有的区别都是他们的名字model!我如何使用一个ListView 来处理这些相同的任务? @WillemVanOnsem @mstafarahnama:你只需要写class ModelAListView(ListView): model=MyModel template='some_templatefora.html',所以每个视图都是三行。通过使用统一的列表视图,您只会产生更多的麻烦,因为模板可能不同,最终您可能希望对某些列表进行一些访问控制。 【参考方案1】:

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

您可以访问request.path,或者您可以让url(..)s 传递一个带有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()),
]

【讨论】:

非常感谢。这正是我要找的!可以回答我的第二个问题吗? @willem-van-onsem @mostafarahnama: 好吧,这里我们将为MyBaseListView的所有子类使用相同的模板('resumes/all_resume.html'),如果你想在子类中更改它,你只需要指定另一个@987654339 @那个班级。该类的所有子类都将继承该类。 也可以回答this的问题吗? @willem-van-onsem

以上是关于在 django 中控制查看和模板输出的请求的主要内容,如果未能解决你的问题,请参考以下文章

模板中 Django 表单的媒体类对象的 JS 和 CSS 列表输出分离

如何查看生成到 django 模板变量中的异常?

Django 模板:如何最好地抑制在 Django 模板中执行 python 代码的输出?

django 模板使用

Django模板:输出所有小数位的浮点数

如何在 django 模板中的一行中显示来自 db 的输出文本