[英]How to search a string with the url patterns in django?
我想為每個創建的帳戶創建個人資料頁面。 創建后,可以訪問用戶配置文件
但在創建之前,我應該驗證url已經可用,而不是由現有的url模式使用。 例如:會有一個像這樣的頁面
現在“約”不是有效用戶。 但它是一個有效的網址模式。 我應該能夠阻止創建名為“約”的用戶。 為此,除了檢查具有該名稱的用戶是否已存在之外,我還需要檢查URL模式。 這該怎么做?
一個簡單的方法是為配置文件頁面提供如下的URL模式: http : //example.com/user/username
但我強烈要求擁有如下http://example.com/username的個人資料頁面
您只需嘗試將地址解析為視圖:
from django.core.urlresolvers import resolve
from myapp.views import user_profile_view
try:
my_view = resolve("/%s/" % user_name)
if my_view == user_profile_view:
# We match the user_profile_view, so that's OK.
else:
# oops, we have another view that is mapped on that URL
# you already have something mapped on this address
except:
# app doesn't have such path
編輯:
您也可以以不同的方式進行檢查:
def user_profile_view(request, user_name):
# some code here
user_profile_view.name = "User Profile View"
然后上面的檢查可能是:
if getattr(my_view, "name", None) == "User Profile View":
...
您可以添加自定義表單字段驗證。 看看這篇文章。 Django和自定義表單驗證
raise forms.ValidationError(u'please choose another username')
檢查並引發錯誤。
或者,您可以嘗試為您的用戶設置以下網址,例如:/ user / < example.com/user/<username>/
編輯1: 您可以將其用作所有無效用戶名的列表
我不認為你可以用django.core.urlresolvers.resolve
檢查這個。 請注意,它只檢查固定網址的模式,而不是網址的可變部分。 在您的情況下,您很可能將'username'作為傳遞給視圖的變量參數。 此模式也將匹配不存在的用戶名。 所以檢查模式不是很好的解決方案。
更好的方法是將不同命名空間中的靜態頁面或其他頁面分開。 例如http://example.com/static/about
或者您可以為您的網站預定義關鍵字/保留字,例如[“about”,...],並在創建用戶時根據用戶名進行檢查。
將您的用戶名視圖放在urls.py的末尾,以便首先檢查其他網址規則。
然后最簡單的方法是獲得一個無效用戶名列表,該列表應該在用戶注冊驗證中使用。
def clean_username(self):
INVALID_USERNAMES = ('about', 'admin', 'register', '...')
username = self.cleaned_data['username']
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
pass
else:
raise forms.ValidationError(u'%s already exists' % username )
if username in INVALID_USERNAMES:
raise forms.ValidationError(u'%s is not a valid username' % username )
return username
首先,用戶名的網址規則:
url(r'^(?P<username>[-\w]+)/$', 'membership.views.profile', name='profile'),
確保用戶名與現有網址規則不沖突有點困難。
我通常處理這個問題的方法是為url添加唯一性:
url(r'^user/(?P<username>[-\w]+)/$', 'membership.views.profile', name='profile'),
如果您必須使用用戶名創建配置文件的url,那么您可以嘗試使用類似這樣的方法來搜索URL: https : //stackoverflow.com/a/2094270/884453然后確保用戶名都是唯一的針對其他用戶名和路由
正如我在寫這篇文章時,有人發布了一個很好的想法,一個驗證器使一堆更有意義。
使用from django.core.urlresolvers import resolve
來檢查它的唯一性是一個很好的解決方案
from django.core.exceptions import ValidationError
from django.core.urlresolvers import resolve
def validate_unique_resolve(value):
urlroute = True
try:
urlroute = resolve(path, urlconf)
except urlresolvers.Resolver404:
urlroute = False
if urlroute != False :
raise ValidationError(u'%s is a reserved url pattern' % value)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.