2013-04-30 25 views
7

Tôi đang cố gắng tạo các url khá có ý nghĩa, nhưng tôi đoán tôi đang làm sai.NoReverseMatch tại/

này hoạt động:

from django.conf.urls.defaults import patterns, url 
from places.views import explore_view 

urlpatterns = patterns('', 
    url(r'', explore_view, name='explore'), 
) 

này không:

from django.conf.urls.defaults import patterns, url 
from places.views import explore_view 

urlpatterns = patterns('', 
    url(r'(?P<countryorcategory>[0-9A-Za-z._%+-]+)', explore_view, name='explore'), 
) 

Như tôi đã nhận được lỗi này:

Reverse for 'explore' with arguments '()' and keyword arguments '{}' not found.

Đây là mã cho explore_view:

def explore_view(request, countryorcategory=None): 
    """ 
    This is the explore view - to view places sugeested by ambassadors 
    """ 
    user = request.user 
    page = request.GET.get("page", 1) 
    per_page = request.GET.get("per_page", 20) 
    category_id = request.GET.get("category_id", None) 

    attrs = request.GET 
    lat = safe_attr(attrs, "lat", "float", None) 
    lon = safe_attr(attrs, "lon", "float", None) 
    q = request.GET.get('q', None) 

    if q and not lat or lon: 
     cache_key = 'GoogleGeocode-{}'.format(hashlib.md5(q.encode('UTF-8', 'replace')).hexdigest()) 
     latlon = cache.get(cache_key) 
     if not latlon: 
      latlon = geocode(q) 
      if latlon: 
       cache.set(cache_key, latlon) 
     if latlon: 
      lat = latlon['lat'] 
      lon = latlon['lng'] 

    if not q: 
     q = '' 

    category_names = getattr(settings, "EXPLORE_CATEGORIES", []) 
    categories = [Category.objects.get(name=cat_name).serialize() for cat_name in category_names] 

    more = True 
    places = Place.objects.explore_places(user, category_id=category_id, lat=lat, lon=lon, page=page, per_page=20) 

    if len(places) != per_page: 
     more = False 

    return render_to_response('explore/main.html', {'places': places, 'categories': categories, 'category_id': category_id, 'lat': lat, 'lon': lon, 'more': more, 'q': q}, RequestContext(request)) 
+1

bài mẫu main.html. –

Trả lời

11

dòng này:

url(r'(?P<countryorcategory>[0-9A-Za-z._%+-]+)', explore_view, name='explore') 

... được xác định một địa chỉ mà có một đối countryorcategory trong mẫu. Bạn cần phải đặt một cuộc tranh cãi trên url của bạn, hoặc những điều sau đây trong mẫu của bạn:

{% url 'explore' argument %} 
{% url 'explore' countryorcategory=argument %} 

Nếu bạn muốn tiếp tục sử dụng các url không tranh cãi với cùng tên, bạn có thể xác định các url thêm có cùng tên nhưng với các mẫu khác nhau. Ví dụ:

urlpatterns = patterns('', 
    url(r'(?P<countryorcategory>[0-9A-Za-z._%+-]+)', explore_view, name='explore'), 
    url(r'', explore_view, name='explore'), 
) 

Sau đó, {% url 'explore' %} sẽ hoạt động cả khi có và không có đối số.

1

Tôi giả sử bạn đang sử dụng một mẫu với một cái gì đó như thế này:

{% url 'explore' argument %} 

Và lỗi này có thể có nghĩa rằng argument không được đặt để bất cứ điều gì.

1

Đối với tôi, tôi đã quên không gian tên của Tuyến đường. Thay vì

{% url 'login' %} 

tôi nên đã viết

{% url 'accounts:login' %} 

với cấu hình này:

# root URLs 
url(r'^accounts/', include('myproject.accounts.accounts.urls', namespace='accounts')) 

# accounts URLs 
url(r'^login$', views.login, name='login') 
Các vấn đề liên quan