使用 django 将 Python 正则表达式转换为路径时遇到问题

Posted

技术标签:

【中文标题】使用 django 将 Python 正则表达式转换为路径时遇到问题【英文标题】:trouble converting Python regex to path with django 【发布时间】:2021-05-07 14:07:17 【问题描述】:

我正在开发一个使用正则表达式 url 的项目。它当前的设计方式是您必须手动键入 url 作为模型字段,然后将其作为参数传递给 urls/views? (我不完全理解这部分是的,还在学习)。这些是我认为是这里的问题的视图、url 和模板。我正在尝试自动化添加蛞蝓的过程,并且该部分正在工作。但是,我似乎无法找到一种方法让它与当前配置 url 的方式一起工作。

视图部分:

class QuizDetailView(DetailView):
    model = Quiz
    slug_field = 'url'
    template_name = 'exam/quiz_detail.html'

视图的另一部分,我认为上面 sn-p 中的 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

网址:

#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'),

最后是模板 sn-ps,这是模型/测验的详细视图:

<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'

接下来,我将网址更改为:

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 %">

当我单击模型/测验的列表视图时,URL 在浏览器上正确显示,我认为这意味着自动 slug 正在工作。但是,一旦我单击该链接,我就会看到此错误:

Reverse for 'quiz_question' with keyword arguments ''quiz_name': ''' not found. 1 pattern(s) tried: ['(?P<slug>[-a-zA-Z0-9_]+)$']

非常感谢任何帮助/指针

【问题讨论】:

【参考方案1】:

我自己想通了,我意识到我遗漏了将测验与上面的 TakeQuiz 模型联系起来的论点。

path('<quiz_name>', QuizTake.as_view(), name='quiz_question'),

上面,我传递了参数 并更改了模板,而不是 slug:

% url 'quiz_question' quiz_name=quiz.slug %

成功了。

【讨论】:

以上是关于使用 django 将 Python 正则表达式转换为路径时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

Python之路Day18-正则及Django

转:Python正则表达式指南

如何使用 python/django 从字符串中提取 url?(使用正则表达式)

python 中的 re.compile 函数(转)

python 正则表达式中反斜杠()的麻烦和陷阱 (转)

Python之路-(js正则表达式前端页面的模板套用Django基础)