2013-10-02 46 views
0

我想對如何確定URL是否可用作對象的第一級url路徑的問題進行排序。例如:如果以前沒有用戶名_1,www.myapp.com/username_1將可用。在Django中作爲第一級URL路徑對象的動態名稱

我發現的一個解決方案是this,但解決方案不正確。驗證部分:

def clean_username(self): 
     username = super(NewRegistrationForm, self).clean_username() 
     try: resolve(urlparse('/' + username + '/')[2]) 
     except Resolver404, e: 
      return username 

     raise ValidationError(_(u'This username does not create ' 
           u'a valid URL. Please choose ' 
           u'another')) 

將始終引發錯誤。它認爲需要有一種方法來檢查URL是否返回404。我可以使用urllib但是我想知道是否有更好的解決方案來解決這個問題?

非常感謝。

+0

你只是想確保用戶名輸入網址中使用時,會有效嗎?什麼是URL的正則表達式?爲什麼你不能僅僅匹配它呢? – jproffitt

+0

只需創建一個普通的url並讓視圖返回一個404如果用戶不存在? – Wolph

+0

@沃爾夫我正在那樣做。問題是弄清楚當用戶註冊一個特定的用戶名時,URL是否返回404。我匹配的url模式是:url(r'^(?P [ - \ w] +)/ $',profile_view,{},'profile') –

回答

1

在這種情況下不需要涉及urls(如果我明白你在做什麼正確的話)。

只要使用這樣的事情,而不是(假設Django的1.5或更高版本):

from django.contrib import auth 

def clean_username(username): 
    url = urlresolvers.reverse('your_view_name', kwargs=dict(username=username)) 
    match = urlresolvers.resolve(url) 
    if match.view_name != 'your_view_name': 
     raise ValidationError(_(
      u'This username does not create a valid URL. Please choose another')) 

    if auth.get_user_model().objects.filter(username__iexact=username): 
     raise ValidationError(_(u'There is already a user with this username')) 

    return username 
+0

問題是我不想讓人使用用戶名解析到其他URL例如/管理員,/設置等。見http://www.elfsternberg.com/2009/06/26/dynamic-names-as-first-level-url-path-objects-in-django/ –

+0

啊,對。我看到了問題,我會更新我的答案:) – Wolph

+0

@ip .:嘗試新版本:) – Wolph