您好!
我很乐意为我开发的django应用程序将URL路由到基于超出URL字符串的逻辑的响应。
我希望能够考虑应用程序的状态(登录用户及其会话,数据库的内容)。这意味着两个用户可以访问完全相同的URL,但根据他们拥有的帐户类型(例如),他们会收到不同的回复。
示例
说我的应用有User
和Admin
个用户类。他们都经常访问http://some-domain.com/dashboard
,但他们会在那里看到完全不同的东西。此外,还有dashboard
之后的子网址,例如/dashboard/comments
,/dashboard/friends
。同样,根据用户类别,这些视图将完全不同。
目前我做的是这样的事情:
(urls.py)
urlpatterns = [
url(r'^dashboard/', include([
url(r'^$', render_dashboard),
url(r'^settings/$', render_dashboard_settings),
url(r'^friends/$', render_dashboard_friends),
])),
]
此设置的问题在于无法将当前用户考虑在内。它仍然可以工作,因为我可以将所有类型的用户帐户路由到同一个模板,并在那里使用{% if ... %}
语句为不同的用户提供不同的内容。在调用django.shortcuts.render
时,我还可以创建应该呈现动态模板的名称。但这些都不是我想要的。我希望能够在较早的URL映射级别区分用户。
我的问题
我做希望做的是扩展url
方法的功能以考虑状态,并根据该功能进行路由。理想情况下,这样的事情:
urlpatterns = [
user_class_based_url(r'', {
'Admin': include([
url(r'^dashboard/', include([
url(r'^$', render_admin_dashboard),
url(r'^settings/$', render_admin_dashboard_settings),
url(r'^friends/$', render_admin_dashboard_friends),
])),
]),
'User': include([
url(r'^dashboard/', include([
url(r'^$', render_user_dashboard),
url(r'^settings/$', render_user_dashboard_settings),
url(r'^friends/$', render_user_dashboard_friends),
])),
]),
'SomeOtherUserClass': include([.....]),
}),
]
现在,为同一个url调用不同的渲染器函数,但是不同的用户类。不幸的是,user_class_based_url
是我完全弥补的。理想情况下,user_class_based_url
将是我可以编写的自定义函数。这样我就可以编写其他类似的函数,以其他方式考虑应用程序的状态。
问题:我有什么方法可以获得此功能吗?
回应“你甚至不应该这样设计”
我给出的例子是为了更快地解决我的问题。我想要我所描述的功能,因为它对于我正在构建的应用程序在很多方面都会非常有用,而且我相信它会比替代方案更好。
注意
我已经在使用django rest框架,以防可以用来实现这个设计。
答案 0 :(得分:1)
如果您想为同一网址格式使用不同的模板,请不要在urls.py
中对模板进行硬编码。相反,路由到views.py
中的view function(或者class-based view),根据您的条件调度到不同的模板。这正是views.py
的用途以及通常如何使用。
有关如何将URL路由到视图功能,最好咨询Django tutorial part 3。 (如果您正在学习Django,您可能希望在第1部分start。)
在教程中引入render
快捷方式时调整the example,调度到不同模板的视图可能如下所示:
from django.shortcuts import render
from .models import Question
def index(request):
if request.user.is_admin():
return render(request, 'polls/admin-index.html', {})
else:
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {'latest_question_list': latest_question_list}
return render(request, 'polls/index.html', context)
答案 1 :(得分:0)
目前在Django中没有办法做到这一点。最近,关于为url调度程序创建新API有this discussion,但任何更改都将在Django的未来版本中进行。