2015-03-13 154 views
0

我正在使用django 1.7 & python 3.4 我試圖執行跟進和取消關注用戶到我的網站,但我卡住了。 urls.pyNoReverseMatch found

url(r'^user/', include('myuserprofile.urls'),), 

myuserprofile.urls.py

urlpatterns = patterns('', 
         url(r'^(?P<slug>[^/]+)/$', 'myuserprofile.views.profile', name='profile'), 
         url(r'^(?P<slug>[^/]+)/follow/$', 'myuserprofile.views.follow', name='follow'), 
         url(r'^(?P<slug>[^/]+)/unfollow/$', 'myuserprofile.views.unfollow', name='unfollow'), 

views.py

@login_required 
def follow(request): 
    myuser = request.user.id 
    if request.method == 'POST': 
     to_user = MyUser.objects.get(id=request.POST['to_user']) 
     rel, created = Relationship.objects.get_or_create(
      from_user=myuser.myuserprofile, 
      to_user=to_user, 
      defaults={'status': 'following'} 
     ) 
else: 
     return HttpResponseRedirect(reverse('/')) 

      if not created: 
       rel.status = 'following' 
       rel.save() 

與模板部分是這樣的:

<form action="{% if relationship.status == 'F' %}{% url 'unfollow' %}{% else %}{% url 'follow' %}{% endif %}" method="POST"> 

爲反向'跟隨'與ar未找到guments'()'和關鍵字參數'{}'。 1個模式嘗試:['user /(?P [^ /] +)/ follow/$']

回答

1

您應該添加用戶的用戶名遵循/ unfollow鏈接:

{% url 'follow' user_to_follow.username %} 

更改urls.py到:

urlpatterns = patterns('myuserprofile.views', 
     url(r'^(?P<username>[^/]+)/$', 'profile', name='profile'), 
     url(r'^(?P<username>[^/]+)/follow/$', 'follow', name='follow'), 
     url(r'^(?P<username>[^/]+)/unfollow/$', 'unfollow', name='unfollow'), 
) 

而視圖的簽名應接受username參數:

@login_required 
def follow(request, username): 
    myuser = request.user.id 
    if request.method == 'POST': 
     to_user = MyUser.objects.get(username=username) 
     ... 
0

您需要使用namespaced URL。 在你的情況下,URL unfollow應引用爲<app_name>:unfollow

+0

我試過了也。即使這是顯示相同的錯誤 – sprksh 2015-03-13 11:32:21

+0

該URL模式需要一個參數'slug'來計算它可以在模板中使用'{%url'myuserprofile:unfollow'%}' – bvidal 2015-03-13 12:10:50

0

如果不同的應用程序使用相同的URL名稱,URL名稱空間允許您唯一地反轉命名的URL模式,即使是 。對於第三方應用程序總是使用命名空間URL( 教程),這是一個很好的練習 。同樣,如果部署了多個應用程序實例,它也允許您反向URL。換句話說,由於單個應用程序的 多個實例將共享命名的網址, 命名空間提供了一種方法來告訴這些命名的網址,除了

對此Here

你必須使用URL namespaces

看看

這裏是我的

民調/ urls.py

from django.conf.urls import patterns, url 

from . import views 

urlpatterns = patterns('', 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'), 
    ... 
) 

所以我們必須使用像

{% url 'polls:index' %} 
+0

'可以傳遞的完整URL我試過了。它顯示'myuserprofile'不是一個已註冊的名稱空間,即使我更新了url:url(r'^ user /',include('myuserprofile.urls',namespace ='myuserprofile')) – sprksh 2015-03-13 11:51:10

0

您錯過了模板中的slu slu。

<form action="{% if relationship.status == 'F' %}{% url 'unfollow' %}{% else %}{% url 'follow' %}{% endif %}" method="POST"> 

應該

<form action="{% if relationship.status == 'F' %}{% url 'unfollow' user.username %}{% else %}{% url 'follow' user.username %}{% endif %}" method="POST">