2015-03-11 2 views
0

Я должен проверить URL-адреса, которые выглядят следующим образом:Джанго urlresolvers реверс для динамически создаваемых идентификаторов

http://127.0.0.1:8000/payment/pay/513623c9/

, но я не знаю, как сказать это функции reverse(). Это мой urls.py

from django.conf.urls import patterns, url 
from payment import views 
from payment.msn import * 

urlpatterns = patterns('', 
    url(r'^$', views.index, name='index'), 
    url(r'^msnstats/', MsnStats.finish_transaction, name='finish_transaction'), 
    url(r'^pay/(?P<payment_id>\w+)/$', views.pay, name='pay') 
) 

И это то, что соответствующая часть моего views.py выглядит следующим образом:

def pay(request, payment_id): 
    try: 
     plan=PaymentPlan.objects.get(payment_id=payment_id) 

payment_id генерируется для каждого плана, поэтому я сначала создать план, получить его payment_id из базы данных и как-то назвать его. Я просто не знаю, как использовать обратное.

+0

Что именно * о [документации 'reverse'] (https://docs.djangoproject.com/en/1.7/ref/urlresolvers/#django.core.urlresolvers.reverse) запутанно? –

+0

Я не уверен, какая часть моего URL-адреса является «аргументом» с точки зрения обратного. Что именно дает вам право быть таким смехотворным? – randomshinichi

+0

Не зря. Я прошу, чтобы: а) мы можем вам помочь; б) мы можем при необходимости улучшить документацию. –

ответ

1
from django.core.urlresolvers import reverse 
url = reverse('pay', args=[plan.payment_id]) 

или

url = reverse('pay', kwargs={'payment_id': plan.payment_id}) 

Обе версии являются действительными.

UPDATE: Если включить payment.urls с namespace аргумент, то вы должны добавить это пространство имен с именем URL-адрес в reverse() вызова:

проекта/urls.py:

url(r'^payment/', include('payment.urls', namespace='payment')), 

оплата/тесты.py:

response = self.client.get(reverse('payment:pay', args=[plan.payment_id])) 
+0

Как оказалось, я уже написал первое решение, но оно не сработало, поэтому я разместил здесь. Это функция теста: \t 'Защита test_msn_payment_id (сам): \t \t план = create_payment_plan ('Лалала') \t \t ответа = self.client.get (обратный ('платить', Args = [plan.payment_id])) \t \t self.assertEqual (response.status_code, 200) ' Который не может с этим: ' django.core.urlresolvers.NoReverseMatch: Reverse для 'платить' с аргументами '(' 34ffb5d7' , «) и именованных аргументов '{}' не найдено. 0 pattern (s) try: [] ' Payment_id генерируется каждый раз, когда создается новый план. – randomshinichi

+0

См. Обновленный ответ. – catavaran

+0

Django переместил реверс из urlresolvers в url для новой версии. Вы можете изменить это, если работаете с более поздней версией django. – Muema

Смежные вопросы