在 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_info
和model
或queryset
即可使用'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 列表输出分离