django - 不要设法对 Django 的 url 使用动态视图
问题描述
我正在尝试动态调用 url 的视图。让我准确地说。我想创建一些对象,实际上是“练习”,每个对象都需要一个视图(因为有大量的变量,这会因练习而异)。我为每个练习使用了一个 TemplateView。实际上,每个人也需要一个不同的htlm,但是这个可以在视图中给出。
我尝试了这里找到的方法:url 的动态
下面是我们感兴趣的代码:我精确地指出,Exercise 类的每个练习(在 models.py 中)都至少有一个名为 Wanted_view 的属性,它指示练习的所需视图。
example.html(其中包含一个练习的链接):
{% for exercise in list_exercise %}
...
<a href="{% url 'vue_exercise' exercise.id exercise.wanted_view %}"> The link to the wanted exercise </a>
...
{% endfor %}
urls.py:
...
from . import views
urlpatterns = [
url(r'^exercise/(?P<exercise_id>\d+)/(?P<channel>\w+)/$', views.switcher, name='vue_exercise'),
]
这里是一个动态 url,它等待着 exercise_id(这里是 exercise.id)和频道(这里是 exercise.wanted_view)。
视图.py:
def switcher(request, channel):
if channel == 'TheFamousWantedView':
return TheFamousWantedView.as_view()(request)
class TheFamousWantedView(generic.TemplateView):
template_name = 'wanted_template.html'
context_object_name = ...
def get_context_data(self, **kwargs):
exercise = Exercise.objects.get(id=kwargs['exercise_id'])
context = super().get_context_data(**kwargs)
context['exercise'] = exercise
return context
在这里,我们构建了练习的视图,它带回了练习的 id,以便能够显示与该练习相关的一些特定信息。
我遇到的问题是切换器功能必须调用好的视图。我有这个错误:
switcher() 得到了一个意外的关键字参数“exercise_id”
此外,我是否能够制作一个类似于切换器的功能,为此我不必为每个视图创建 IF 条件,就像上面的“if channel == 'TheFamousWantedView' ...)?
解决方案1:我以这种方式修改了我的功能
def switcher(request, niveau_id, channel):
if channel == 'TheFamousWantedView':
return TheFamousWantedView.as_view()(request)
现在调用了 TheFamousWantedView,这很酷,但还有另一个问题。kwargs 字典似乎已被清空,现在出现了一个 KeyError,它告诉我,executive_id 是未知的......在我定义该切换器功能之前,它工作得很好。
任何想法 ??
解决方案
def switcher(request, channel):
此函数仅从您的 url 接收一个参数channel
,该参数exercise_id
未正确接收。无论如何,即使您不打算对它做任何事情,您也必须处理它。
def switcher(request, exercise_id, channel):
对于“此外”,我认为您可以使用这些渠道创建一个模型,并为类似于template_name
. 然后在您的函数中调用模板后获得正确的通道。
推荐阅读
- node.js - 如何为 RESTlet 构造 OAuth 授权标头?
- html - svg 使用动画标签显示加载点的动画路径
- python - 如何比较模板中的 request.path 和 user.username?
- javascript - 如何将快照限制为 1 个文档?
- visual-c++ - 如何快速识别三角形和圆形的框是否重叠
- c# - C# Winform:对 FileSystemWatcher 路径使用全局变量
- c++ - 如何可靠地强制对对象的方法进行虚拟调度?
- c++ - 如何找到自 01/JAN/1970 00:00:00 (UTC) 以来经过的纳秒数?
- javascript - 通过另一个控制器调用函数时无法读取未定义的属性“byId”
- ios - 如何在 iOS 模拟器中重置推送通知权限?