使用 Django 将 Python 正则表达式转换为路径时遇到问题
trouble converting Python regex to path with django
我正在开发一个使用正则表达式 urls 的项目。目前的设计方式是您必须手动键入 url 作为模型字段,然后将其作为参数传递给 urls/views? (我不完全理解这部分是的,仍在学习中)。这些是我认为是问题所在的视图、urls 和模板。我正在尝试使添加 slug 的过程自动化,并且该部分正在运行。但是,我似乎无法找到一种方法让它与当前配置的 url 一起工作。
观点部分:
class QuizDetailView(DetailView):
model = Quiz
slug_field = 'url'
template_name = 'exam/quiz_detail.html'
视图的另一部分,我认为上面代码片段中的 url 变成了一个变量,然后在 url:
中使用
class QuizTake(FormView):
form_class = QuestionForm
template_name = 'exam/question.html'
def dispatch(self, request, *args, **kwargs):
self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name'])
if self.quiz.draft and not request.user.has_perm('quiz.change_quiz'):
raise PermissionDenied
urls:
#passes variable 'quiz_name' to quiz_take view
url(regex=r'^(?P<slug>[\w-]+)/$',
view=QuizDetailView.as_view(),
name='quiz_start_page'),
url(regex=r'^(?P<quiz_name>[\w-]+)/take/$',
view=QuizTake.as_view(),
name='quiz_question'),
最后是模板片段,这是 model/quiz:
的详细视图
<a href="{% url 'quiz_start_page' quiz.url %}">
这个显示模型(这是用户参加的测验):
<a href="{% url 'quiz_question' quiz_name=quiz.url %}">
到目前为止我尝试过的:
首先,因为我有 slug 字段:
class QuizDetailView(DetailView):
model = Quiz
slug_field = 'url' ---this was commented out
template_name = 'exam/quiz_detail.html'
接下来,我将 urls 更改为:
url(regex=r'^(?P<slug>[\w-]+)/$',
view=QuizDetailView.as_view(),
name='quiz_start_page'),
url(regex=r'^(?P<quiz_name>[\w-]+)/take/$',
view=QuizTake.as_view(),
name='quiz_question'),
至:
path('<slug:slug>/', QuizDetailView.as_view(), name='quiz_start_page'),
path('<slug:slug>', QuizTake.as_view(), name='quiz_question'),
然后我更改了模板:
<a href="{% url 'quiz_start_page' quiz.url %}">
<a href="{% url 'quiz_question' quiz_name=quiz.url %}">
收件人:
<a href="{% url 'quiz_start_page' quiz.slug %}">
<a href="{% url 'quiz_question' quiz.slug %}">
当我单击 model/quiz 的列表视图时,url 在浏览器上正确显示,我认为这意味着自动 slug 正在工作。但是,单击 link 后,我看到此错误:
Reverse for 'quiz_question' with keyword arguments '{'quiz_name': ''}' not found. 1 pattern(s) tried: ['(?P<slug>[-a-zA-Z0-9_]+)$']
非常感谢任何help/pointers
我自己弄明白了,我意识到我遗漏了将测验链接到上面的 TakeQuiz 模型的论点。
path('<quiz_name>', QuizTake.as_view(), name='quiz_question'),
在上面,我传递了参数 而不是 slug 并且也更改了模板:
{% url 'quiz_question' quiz_name=quiz.slug %}
有效。
我正在开发一个使用正则表达式 urls 的项目。目前的设计方式是您必须手动键入 url 作为模型字段,然后将其作为参数传递给 urls/views? (我不完全理解这部分是的,仍在学习中)。这些是我认为是问题所在的视图、urls 和模板。我正在尝试使添加 slug 的过程自动化,并且该部分正在运行。但是,我似乎无法找到一种方法让它与当前配置的 url 一起工作。
观点部分:
class QuizDetailView(DetailView):
model = Quiz
slug_field = 'url'
template_name = 'exam/quiz_detail.html'
视图的另一部分,我认为上面代码片段中的 url 变成了一个变量,然后在 url:
中使用class QuizTake(FormView):
form_class = QuestionForm
template_name = 'exam/question.html'
def dispatch(self, request, *args, **kwargs):
self.quiz = get_object_or_404(Quiz, url=self.kwargs['quiz_name'])
if self.quiz.draft and not request.user.has_perm('quiz.change_quiz'):
raise PermissionDenied
urls:
#passes variable 'quiz_name' to quiz_take view
url(regex=r'^(?P<slug>[\w-]+)/$',
view=QuizDetailView.as_view(),
name='quiz_start_page'),
url(regex=r'^(?P<quiz_name>[\w-]+)/take/$',
view=QuizTake.as_view(),
name='quiz_question'),
最后是模板片段,这是 model/quiz:
的详细视图<a href="{% url 'quiz_start_page' quiz.url %}">
这个显示模型(这是用户参加的测验):
<a href="{% url 'quiz_question' quiz_name=quiz.url %}">
到目前为止我尝试过的:
首先,因为我有 slug 字段:
class QuizDetailView(DetailView):
model = Quiz
slug_field = 'url' ---this was commented out
template_name = 'exam/quiz_detail.html'
接下来,我将 urls 更改为:
url(regex=r'^(?P<slug>[\w-]+)/$',
view=QuizDetailView.as_view(),
name='quiz_start_page'),
url(regex=r'^(?P<quiz_name>[\w-]+)/take/$',
view=QuizTake.as_view(),
name='quiz_question'),
至:
path('<slug:slug>/', QuizDetailView.as_view(), name='quiz_start_page'),
path('<slug:slug>', QuizTake.as_view(), name='quiz_question'),
然后我更改了模板:
<a href="{% url 'quiz_start_page' quiz.url %}">
<a href="{% url 'quiz_question' quiz_name=quiz.url %}">
收件人:
<a href="{% url 'quiz_start_page' quiz.slug %}">
<a href="{% url 'quiz_question' quiz.slug %}">
当我单击 model/quiz 的列表视图时,url 在浏览器上正确显示,我认为这意味着自动 slug 正在工作。但是,单击 link 后,我看到此错误:
Reverse for 'quiz_question' with keyword arguments '{'quiz_name': ''}' not found. 1 pattern(s) tried: ['(?P<slug>[-a-zA-Z0-9_]+)$']
非常感谢任何help/pointers
我自己弄明白了,我意识到我遗漏了将测验链接到上面的 TakeQuiz 模型的论点。
path('<quiz_name>', QuizTake.as_view(), name='quiz_question'),
在上面,我传递了参数
{% url 'quiz_question' quiz_name=quiz.slug %}
有效。