2013-05-13 2 views
0

의 URL을 리버스해결은 다음 장고 사이트 구조를 고려 장고

root/ 
- manage.py 
- main/ 
-- __init__.py 
-- settings.py 
-- urls.py 
- phase1/ 
-- __init__.py 
-- urls.py 
-- phase1/content/ 
--- __init__.py 
--- models.py 
--- views.py 

즉 3 개 앱, 주/1 위상/1 위상 및/컨텐츠 /한다.

#main/urls.py 

urlpatterns = patterns('', 
    url(r'^phase1/', include('phase1.urls')),) 

#phase1/urls.py 

url(r'^problem/(\d+)/$', content.views.view_problem, name='problem') 

#phase1/content/models.py 

class Problem(django.db.models.Model): 
    ## stuff and fields 
    def get_absolute_url(self): 
     return django.core.urlresolvers.reverse('content.views.view_problem', 
               args=[str(self.id)]) 

는 분명이 URL/1 위상/문제의 요청/1/콘텐츠에 대해 묻는 :

설정의 root_url은 모듈의 관련 코드는 주/url.py 및 입니다 .view.view_problem을 올바른 인수와 함께 사용하십시오. 그러나 reverse 함수는이 경로가 사용될 때 (예를 들어 템플릿에서)이 경로를 생성하지 않습니다.

'phase1'접두어를 추가하면 reverse()의 첫 번째 인수에서 :

 return django.core.urlresolvers.reverse('phase1.content.views.view_problem', 
               args=[str(self.id)]) 

이 작동합니다. 이것은 phase1/content가 장고 의미에서 이식 가능한 앱이라고 가정하기 때문에 원하는 내용이 아니므로 "phase1"은 콘텐츠/애플리케이션의 코드 안에 있으면 안됩니다 ...

아마도 내가 뭔가를 놓치고 있습니다. . 누군가 이런 일이 일어나는 이유와 해결책에 대해 적절한 설명을 줄 수 있습니까?

+0

'manage.py'의 설정을 확인하십시오. 'content' 앱과 관련된 디렉토리가 manage.py에 있다면'phase1'을 포함 할 필요가 없습니다. – karthikr

답변

0

URL의 이름을 사용해야합니다. 즉,

return django.core.urlresolvers.reverse('problem', 
             args=[str(self.id)]) 
+0

좋습니다. 가능한 해결책입니다. Reverse는 또한 뷰 네임 스페이스를 지원합니다 (마지막 테스트에서 보여 줬던 것처럼). resolve가 phase1을 찾지 못하는 이유를 이해하려고합니다. –

+0

불행히도이 솔루션은 휴대용과는 거리가 멀습니다. URL 이름은 앱간에 서로 충돌합니다. –