Python 3.x Django将isbn10传递到url
我似乎无法将isbn10号码传递给DjangoPython 3.x Django将isbn10传递到url,python-3.x,django,regex,Python 3.x,Django,Regex,我似乎无法将isbn10号码传递给Django <a href="{% url 'books-to-detail' fic.isbn %}"> <section class="slideshow-fiction"> <img src="{{ fic.image }}" alt="" /> <p>{{ fic.title
<a href="{% url 'books-to-detail' fic.isbn %}">
<section class="slideshow-fiction">
<img src="{{ fic.image }}" alt="" />
<p>{{ fic.title|truncatewords:4 }}</p>
<!-- <p>{{ fic.description }}</p> -->
<p>{{ fic.author }}</p>
<!-- <p>{{ fic.isbn }}</p> -->
</section>
</a>
数字示例为059318808X和0316539562。我尝试过使用re_path和regex,但是如果我得到一个数字可以通过,另一个则不行。这是我尝试过的路径之一,但0316539562没有通过
re_path(
r"^redirect/books/(?P<isbn>[0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*[-| ][0-9]*\w)/$",
redirect_books_to_detail,
name="books-to-detail",
),
re\u路径(
r“^redirect/books/(?P[0-9]*[-[0-9]*[-[0-9]*[-[0-9]*[-[0-9]*[-[0-9]*\w)/$”,
将书籍重定向到详细信息,
name=“书籍详情”,
),
错误
正在尝试此url路径
re_path(
r"^redirect/books/(?P<isbn>[\w\+%_& ]+)/$",
redirect_books_to_detail,
name="books-to-detail",
),
re\u路径(
r“^redirect/books/(?P[\w\+%\u&]+)/$”,
将书籍重定向到详细信息,
name=“书籍详情”,
),
我现在得到一个错误,您用来识别ISBN号的正则表达式部分看起来有点太复杂了 ISBN10由10个字符组成。其中9个应该是数字,最后一个可以是数字或
X
字符。表示这一点的正则表达式类似于\d{9}[\dX]
或[0-9]{9}[0-9X]
您可以使用python解释器快速测试这是否匹配:
>>重新导入
>>>re.fullmatch(r“\d{9}[\dX]”,“059318808X”)#返回一个匹配项
>>>re.fullmatch(r“\d{9}[\dX]”,“123X”)#不返回匹配
>>>re.fullmatch(r“\d{9}[\dX]”,“0316539562”)#返回一个匹配项
>>>re.fullmatch(r“\d{9}[\dX]”,“03165395629999”)#不返回匹配项
因此,您传递给re\u path
的路径应该是
r“^redirect/books/(?P\d{9}[\dX])/$”
如果您决定接受包含破折号的ISBN,则需要将正则表达式更改为类似于
(\d-?){9}[\dX]
,这意味着我们需要9位数字,其中任何一位可能(但不是必须)后跟破折号,然后是最后一个数字-or-X。我已经使用了你的建议,但现在错误是,与“books to detail”相反,未找到参数(“”,)”。尝试了1个模式:['redirect/books/(?P\\d{9}[\\dX])/$']
。需要注意的是,django模板中的isbn是字符串。如果参数是(“”,
,则表示传递了一个空字符串(它不是有效的isbn,因此无法与URL表达式匹配。也许您应该将代码从href=“{%URL”books to detail'fic.isbn%}
更改为{%If fic.isbn%}href=“{%url”books to detail'fic.isbn%}”{%endif%}
因此,如果isbn丢失,您不会尝试生成链接(在这种情况下,链接没有多大意义)是的。结果是其中一个企业没有isbn10号。谢谢