iT邦幫忙

0

django的正則表達式沒用

  • 分享至 

  • xImage

我希望能讓除了"admin"以外讓其他網址都使用home這個視圖
我有設定一個新的轉換器
https://ithelp.ithome.com.tw/upload/images/20221129/20148005caA3itSCz7.jpg
這個是我目前在用的正則表達式^(?!(admin)$)
在編輯器裡沒問題
https://ithelp.ithome.com.tw/upload/images/20221129/20148005iAtKq23XtK.jpghttps://ithelp.ithome.com.tw/upload/images/20221129/20148005qJbrKTPBWw.jpg
但是沒辦法在django用
https://ithelp.ithome.com.tw/upload/images/20221129/201480058yYCAcxLlZ.jpg
請問是哪裡出了問題

froce iT邦大師 1 級 ‧ 2022-11-29 09:34:46 檢舉
regex = "^(?!admin$).*"

不過你要搞前後端分離?如果是的話可以在前端抓就好。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
hokou
iT邦好手 1 級 ‧ 2022-11-29 09:23:58
最佳解答

是不是要改用 re_path 啊?

URLconfs 中使用的 django.urls 函数
Day13 : path & re_path vs. url
Django 路由

沒看到是 register_converter,不太熟
但你的自定義是不是沒有 defreturn

注册自定义的路径转换器
URL路由基础
Django的路由转换器的使用

看更多先前的回應...收起先前的回應...

改了re_path確實好了,不過我的home視圖有用到後面的resource那個資料...
請問要從哪裡取得?

hokou iT邦好手 1 級 ‧ 2022-11-30 08:06:23 檢舉

依照官方例子,是要有下面的 defreturn
不確定你的有沒有

class FourDigitYearConverter:
    regex = '[0-9]{4}'

    def to_python(self, value):
        return int(value)

    def to_url(self, value):
        return '%04d' % value
from django.urls import path, register_converter

from . import converters, views

register_converter(converters.FourDigitYearConverter, 'yyyy')

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<yyyy:year>/', views.year_archive),
    ...
]

<yyyy:year> 依照定義,前面是你自定義(register_converter)名稱,後面是你在 view 要傳入的參數名稱

例如

urlpatterns = [
    path('articles/2003/', views.special_case_2003),
    path('articles/<int:year>/', views.year_archive),
    path('articles/<int:year>/<int:month>/', views.month_archive),
    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]

/articles/2005/03/ 会匹配 URL 列表中的第三项
也就是
path('articles/<int:year>/<int:month>/', views.month_archive),

Django 会调用函数 views.month_archive(request, year=2005, month=3)

hokou iT邦好手 1 級 ‧ 2022-11-30 14:56:04 檢舉

re 的話應該是這樣
(?P<關鍵字>要擷取的參數)

re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),

==
Django學習紀錄 16.URL配置與視圖進階技巧
Django3中urls.py里path与re_path的几种用法

感謝

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-11-29 11:15:33

1.Regular Expression 看來沒錯
auth (1 matched)
a (1 matched)
admin (0 matched)
2.register_converter/url_pattern 的用法可能才是正式原因所在
請參考官方教學(有範例)

看更多先前的回應...收起先前的回應...
froce iT邦大師 1 級 ‧ 2022-11-29 11:30:56 檢舉

有錯啦,我測試過了,給的正則也是測試過的。

我用 Regex 101 測試結果如下
https://ithelp.ithome.com.tw/upload/images/20221129/20001787Qlmln0aZ23.jpg
https://ithelp.ithome.com.tw/upload/images/20221129/20001787jHbevsmfsR.jpg
https://ithelp.ithome.com.tw/upload/images/20221129/20001787DDEHuXt79t.jpg

froce iT邦大師 1 級 ‧ 2022-11-29 14:45:39 檢舉

對啊,這樣auth和a、admin都不符合啊。
我早上幫他測過了。符合的會有藍色標記。

^(?!(admin)$)
https://regex101.com/r/NGrFjx/1

^(?!admin$).*
https://regex101.com/r/QhGXPH/1

其實我連django內都測過了。
我大概猜到他想幹嘛,大概是前端用框架開發,並且用前端路由,但我覺得他的做法沒啥必要性。

這樣auth和a、admin都不符合啊。

請看一下各截圖右上角的小字
1 match 和 no match
/images/emoticon/emoticon25.gif

總之
這問題和 RE 沒什麼太大關係
一般設定就可以處理了...

froce iT邦大師 1 級 ‧ 2022-11-29 14:55:00 檢舉

你注意看右邊的match group,問題是他抓到的是null啊...
match group抓到null傳到django的path converter裡那個值就是null。值是null,django就跳404。

他的問題就是正則出問題啦,我早上就開過django專案測試過了。包含path converter都整個測試過了。

明白了
樓主都不急,我們在討論個什麼勁
不如去/images/emoticon/emoticon78.gif

froce iT邦大師 1 級 ‧ 2022-11-29 15:16:50 檢舉

閒聊啊,反正幫人寫正則自己也能學到點東西。XD

regex的問題嗎...我試試

確實regex也有問題,問題已經解決了,謝謝各位

我要發表回答

立即登入回答