2015-10-06 3 views
0

это должно быть что-то простое, но я потратил последние два часа, пытаясь это исправить. Это на Django 1.7 и Python 2.7Ошибка с URL-адресом в шаблоне

Я получаю следующее сообщение об ошибке:

ImproperlyConfigured at/

The included urlconf 'blog.urls' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import. 

, которая была вызвана этой линии в шаблоне:

>> {% url 'referrals:confirm_referral' claimCode %} << 

когда следующая строка выполняется в представлении:

msg_plain = render_to_string('referrals/email/sendInvite.txt', emailVariables) 

Я попытался reverse_lazy вызов в пределах dict, а также ленивый, но это не решило проблему.

Вот мой urls.py:

urlpatterns = patterns('', 
    url(r'^confirm-referral/<confirm_code>[a-zA-Z0-9]{8}$', views.confirmReferral, name='confirm_referral',), 
) 

здесь соответствующая часть кода (в отдельном файле под названием jobs.py):

  emailVariables = { 
       'commsPromoHeadline' : thisOfferClaim.linkedOffer.commsPromoHeadline, 
       'commsPromoSubHeading' : thisOfferClaim.linkedOffer.commsPromoSubHeading, 
       'commsInvitationShortMessage' : thisOfferClaim.linkedOffer.commsInvitationShortMessage, 
       'commsInvitationLongMessage' : thisOfferClaim.linkedOffer.commsInvitationLongMessage, 
       'commsOfferButtonText' : thisOfferClaim.linkedOffer.commsOfferButtonText, 
       'commsBanner' : thisOfferClaim.linkedOffer.commsBanner, 
       'claimCode' : thisRecipient.claimCode, 
       #'offerLink' : lazy('referrals:confirm_referral' + thisRecipient.claimCode), 
       #'offerLink' : reverse_lazy('referrals:confirm_referral'), 
       'sender': thisOfferClaim.sender, 
       'recipient' : thisRecipient 
       } 
      msg_plain = render_to_string('referrals/email/sendInvite.txt', emailVariables) 
      msg_html = render_to_string('referrals/email/sendInvite.html', emailVariables) 

и, наконец, следующее экстракт из соответствующего шаблона:

You can quickly join by clicking on the link below: 
>> {% url 'referrals:confirm_referral' claimCode%} << 

Что я делаю неправильно?

Обновление 1: У меня есть две строки, прокомментированные выше в dict. Когда я раскомментировать

offerLink' : reverse_lazy('referrals:confirm_referral'), 

я получаю следующее в качестве возвращаемого значения:

<django.utils.functional.__proxy__ object at 0x0441F890> 

я ожидал бы строка? Это то, что вызывает проблему?

Update 2: Мой главный urls.py ниже:

import os 
from django.views.generic import TemplateView 
from django.conf.urls import patterns, include, url 
from django.conf.urls.static import static 
from django.conf import settings 
from django.contrib import admin 

from wagtail.wagtailadmin import urls as wagtailadmin_urls 
from wagtail.wagtailsearch import urls as wagtailsearch_urls 
from wagtail.wagtaildocs import urls as wagtaildocs_urls 
from wagtail.wagtailcore import urls as wagtail_urls 
from wagtail.contrib.wagtailsitemaps.views import sitemap 
#import debug_toolbar 


urlpatterns = patterns('', 
    #url(r'^__debug__/', include(debug_toolbar.urls)), 
    url('^$', TemplateView.as_view(template_name='home.html')), 
    url(r'^', include('people.urls')), 
    url(r'^', include('reviews.urls')), 
    url(r'^', include('commerce.urls')), 
    url(r'^accounts/', include('allauth.urls')), 
    url(r'^activities/', include('video.urls',namespace='activities')), 
    url(r'^course/', include('video.urls',namespace='course-videos')), 
    url(r'^refer/', include('referrals.urls',namespace='referrals')), 
    url(r'^robots.txt$', TemplateView.as_view(template_name='robots.txt', content_type='text/plain')), 
    url(r'^', include('people.urls')), 
    url(r'^mission-control/', include(admin.site.urls)), 
    url(r'^cms-admin/', include(wagtailadmin_urls)), 
    url(r'^search/', include(wagtailsearch_urls)), 
    url(r'^documents/', include(wagtaildocs_urls)), 
    url('^sitemap\.xml$', sitemap), 
    url(r'^', include(wagtail_urls)), 
) 


if settings.DEBUG: 
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns 


    urlpatterns += staticfiles_urlpatterns() 
    urlpatterns += static(settings.MEDIA_URL + 'video/', document_root=os.path.join(settings.MEDIA_ROOT, 'video')) 
    urlpatterns += static(settings.MEDIA_URL + 'images/', document_root=os.path.join(settings.MEDIA_ROOT, 'images')) 
    urlpatterns += static(settings.MEDIA_URL + 'attachments/', document_root=os.path.join(settings.MEDIA_ROOT, 'attachments')) 
    urlpatterns += static(settings.MEDIA_URL + 'platform/', document_root=os.path.join(settings.MEDIA_ROOT, 'platform')) 
    urlpatterns += static(settings.MEDIA_URL + 'offer/', document_root=os.path.join(settings.MEDIA_ROOT, 'offer')) 
    urlpatterns += static(settings.MEDIA_URL + 'people/', document_root=os.path.join(settings.MEDIA_ROOT, 'people')) 
    urlpatterns += static(settings.MEDIA_URL + 'reward/', document_root=os.path.join(settings.MEDIA_ROOT, 'reward')) 

Update 3: Я переместил все в вид, но я все еще получаю ту же ошибку. Код можно найти ниже:

class sendReferralMail(): 
    ########################################################## 
    # this job sends out emails who have been invited to 
    # participate in a referral scheme 
    ########################################################## 
    try: 
     #try to get all outstanding claims that are linked to receipients with a status of "commsPending". also prefetch recipient details to minimise DB hits 
     allOfferClaims = OfferClaim.objects.filter(recipient__status='commsPending').prefetch_related('recipient') 
    except: 
     allOfferClaims = None 
    if allOfferClaims: 
     for thisOfferClaim in allOfferClaims: 
      #go through each recipient that we've already filtered on previously 
      for thisRecipient in thisOfferClaim.recipient.all(): 
       if thisRecipient.status == 'commsPending': 
        #get offer-specific content that we should be sending them 
        emailVariables = { 
         'commsPromoHeadline' : thisOfferClaim.linkedOffer.commsPromoHeadline, 
         'commsPromoSubHeading' : thisOfferClaim.linkedOffer.commsPromoSubHeading, 
         'commsInvitationShortMessage' : thisOfferClaim.linkedOffer.commsInvitationShortMessage, 
         'commsInvitationLongMessage' : thisOfferClaim.linkedOffer.commsInvitationLongMessage, 
         'commsOfferButtonText' : thisOfferClaim.linkedOffer.commsOfferButtonText, 
         'commsBanner' : thisOfferClaim.linkedOffer.commsBanner, 
         'claimCode' : thisRecipient.claimCode, 
         'domain' : Site.objects.get_current().domain, 
         'offerLink' : unicode(reverse_lazy('referrals:confirm_referral')), 
         'full_url' : ''.join(['http://', Site.objects.get_current().domain, unicode(reverse_lazy('referrals:confirm_referral')), thisRecipient.claimCode]), 
         'sender': thisOfferClaim.sender, 
         'recipient' : thisRecipient 
         } 
        msg_plain = render_to_string('referrals/email/sendInvite.txt', emailVariables) 
        msg_html = render_to_string('referrals/email/sendInvite.html', emailVariables) 
        send_mail(
         thisOfferClaim.linkedOffer.commsPromoHeadline, 
         msg_plain, 
         settings.REFERRAL_EMAIL_SENDER, 
         [thisRecipient.email], 
         html_message=msg_html, 
        ) 
+0

Пожалуйста, отобразите основной urls.py который включает этот. –

+0

@ DanielRoseman - главная urls.py сейчас в обновлении 2. спасибо за вашу помощь до сих пор – AndrewO

ответ

0

Ваш назвал регулярное выражение группа не в правильной форме, он должен быть в форме (?P<name>pattern):

r'^confirm-referral/<confirm_code>[a-zA-Z0-9]{8}$' 

должны стать:

r'^confirm-referral/(?P<confirm_code>[a-zA-Z0-9]{8})$' 

, где:

name = confirm_code 
pattern = [a-zA-Z0-9]{8} 

https://docs.djangoproject.com/en/1.7/topics/http/urls/#named-groups

+0

спасибо - хорошее место. Я обновил его, но я все равно получаю ту же ошибку – AndrewO

+0

, чтобы убедиться, что вы не включаете пустой файл urls.py, в этом случае проверьте, есть ли в блоге: urls'ы какие-либо шаблоны. – HassenPy

0

Похоже, возможно, вы визуализируете шаблон, содержащий тег url, перед загрузкой конфигурации URL.

Использование reverse_lazy не будет работать в этом случае, если шаблон отображается до того, как Django загрузил конфигурацию url.

Вы можете исправить эту проблему, перемещая вызовы render_to_string в представление.

+0

не может быть достигнуто путем установки '' DJANGO_SETTINGS_MODULE' env var и вызова '' django.setup() '' в отдельном файле? – HassenPy

+0

не уверен, что вы .. – HassenPy

+0

@HassenPy 'django.setup()' используется в автономных скриптах. ОП упоминает его взгляды, поэтому я не думаю, что это полезно в этом случае. – Alasdair

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