2016-01-03 28 views
6

Djangoを使用して静的なサイトジェネレータを構築しようとしています。静的なサイトのコンテンツをディレクトリに構築するはずです。どうやら私の 'NoneType'オブジェクトには属性 'split'はありませんが、その 'NoneType'オブジェクトが何であるかはわかりません。Django:AttributeError: 'NoneType'オブジェクトに 'split'属性がありません

(thisSite) C:\Users\Jaysp_000\thisSite\PROJECTx>python prototype.py build 
Traceback (most recent call last): 
    File "prototype.py", line 31, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\management\__init__.py", 
line 338, in execute_from_command_line 
    utility.execute() 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\management\__init__.py", 
line 330, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\management\base.py", lin 
e 390, in run_from_argv 
    self.execute(*args, **cmd_options) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\management\base.py", lin 
e 441, in execute 
    output = self.handle(*args, **options) 
    File "C:\Users\Jaysp_000\thisSite\PROJECTx\sitebuilder\management\commands\build.py", li 
ne 38, in handle 
    response = this_client_will.get(the_page_url) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\test\client.py", line 500, in 
get 
    **extra) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\test\client.py", line 303, in 
get 
    return self.generic('GET', path, secure=secure, **r) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\test\client.py", line 379, in 
generic 
    return self.request(**r) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\test\client.py", line 466, in 
request 
    six.reraise(*exc_info) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\utils\six.py", line 659, in r 
eraise 
    raise value 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\core\handlers\base.py", line 
132, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Users\Jaysp_000\thisSite\PROJECTx\sitebuilder\views.py", line 35, in page 
    return render(request, 'page.html', context) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\shortcuts.py", line 67, in re 
nder 
    template_name, context, request=request, using=using) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\loader.py", line 99, 
in render_to_string 
    return template.render(context, request) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\backends\django.py", 
line 74, in render 
    return self.template.render(context) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\base.py", line 208, 
in render 
    with context.bind_template(self): 
    File "C:\Python34\Lib\contextlib.py", line 59, in __enter__ 
    return next(self.gen) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\context.py", line 23 
5, in bind_template 
    updates.update(processor(self.request)) 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\template\context_processors.p 
y", line 56, in i18n 
    context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi() 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\utils\translation\__init__.py 
", line 177, in get_language_bidi 
    return _trans.get_language_bidi() 
    File "C:\Users\Jaysp_000\thisSite\lib\site-packages\django\utils\translation\trans_real. 
py", line 263, in get_language_bidi 
    base_lang = get_language().split('-')[0] 
AttributeError: 'NoneType' object has no attribute 'split' 

私の問題は、私はbuildを呼んで、私のコマンドファイルにあるようです。トレースバックでは、私のviewsファイルも表示されます。これは、自分自身でうまく動作します(つまり、自分のhtmlファイルはローカルサーバ上で適切に提供されます)が、とにかくそれを組み込みます。

は、ここで私のurls.py

import os, shutil 
from django.conf import settings 
from django.core.management import call_command 
from django.core.management.base import BaseCommand 
from django.core.urlresolvers import reverse 
from django.test.client import Client 

def get_pages(): 
    for name in os.listdir(settings.STATIC_PAGES_DIRECTORY): 
     if name.endswith('.html'): 
      yield name[:-5] 


class Command(BaseCommand): 
    help = 'Build static site output.' 

    def handle(self, *args, **options): 
     """Request pages and build output.""" 
     if os.path.exists(settings.SITE_OUTPUT_DIRECTORY): 
      shutil.rmtree(settings.SITE_OUTPUT_DIRECTORY) 
     os.mkdir(settings.SITE_OUTPUT_DIRECTORY) 
     os.makedirs(settings.STATIC_ROOT) 
     call_command('collectstatic', interactive=False, clear=True, verbosity=0) 
     this_client_will = Client() 

     for page in get_pages(): 
      the_page_url = reverse('page',kwargs={'slug': page})  # PROBLEM SEEMS TO GENERATE STARTING HERE 
      response = this_client_will.get(the_page_url) 
      if page == 'index.html': 
       output_dir = settings.SITE_OUTPUT_DIRECTORY 
      else: 
       output_dir = os.path.join(settings.SITE_OUTPUT_DIRECTORY, page) 
       os.makedirs(output_dir) 
      with open(os.path.join(output_dir, 'index.html'), 'wb', encoding='utf8') as f: 
       f.write(response.content) 

import os 
from django.conf import settings 
from django.http import Http404 
from django.shortcuts import render 
from django.template import Template 
from django.utils._os import safe_join 

# Create your views here. 

def get_page_or_404(name): 
    """Returns page content as a Django template or raise 404 error""" 
    try: 
     file_path = safe_join(settings.STATIC_PAGES_DIRECTORY, name) 
    except ValueError: 
     raise Http404("Page Not Found") 
    else: 
     if not os.path.exists(file_path): 
      raise Http404("Page Not Found") 

    with open(file_path,"r", encoding='utf8') as f: 
     the_page = Template(f.read()) 

    return the_page 

def page(request, slug='index'): 
    """ Render the requested page if found """ 
    file_name = '{0}.html'.format(slug) 
    page = get_page_or_404(file_name) 
    context = {'slug': slug, 'page': page} 
    return render(request, 'page.html', context) # THE TRACEBACK POINTS AT THIS LINE, TOO 

views.pyと念のためにそれを知っておくと便利になっているbuild.py

from django.conf.urls import include, url 

urlpatterns = [ 
    url(r'^page/(?P<slug>[-\w]+)/$', 'sitebuilder.views.page', name='page'), 
    url(r'^page$', 'sitebuilder.views.page', name='homepage'), 
] 

この問題は、主にこの問題がビルド・モジュールに見られるようにreverse()関数に結びついているように見えるため、私は覚えている限り長い間その関数を使用していましたが、わかりませんこれが本当に私の問題ならば。誰かが私の問題がどこから来ているのか、それを解決する方法を知るのを助けることができますか?大変感謝しています。

+0

あなたのサイトはi18nをサポートしていますか? – doniyor

答えて

6
base_lang = get_language().split('-')[0] 

この行はDjangoの1.8のバグです。

Prevented TypeError in translation functions check_for_language() and get_language_bidi() when translations are deactivated (#24569).

あなたは、最新は1.8.xリリース、1.8.8にアップグレードする必要があります:それは1.8.1の一部として修正されました。書面の時に。これでこのバグやその他の問題が修正されます。

マイナーリリースにはバグフィックスとセキュリティパッチしか含まれていないため、使用しているメジャーバージョンの最新のマイナーリリースにアップグレードする必要があります。

+0

フィードバックありがとう!私はそれを試みるでしょう。どうすればいいのか分かりますか?私はdjango 1.8をアンインストールしてdjango 1.8.8をインストールする必要がありますか、何とかアップグレードできますか? – JellisHeRo

+3

'pip install -U Django <1.9'を実行できます。 – knbk

+0

ありがとう!あなたとドニゴールの両方があなたのソリューションに合っていました。彼らは本当に私を助けました! – JellisHeRo

5

は、ページビューで言語をアクティブにしよう:

from django.utils import translation 

def page(request, slug='index'): 
    """ Render the requested page if found """ 
    file_name = '{0}.html'.format(slug) 
    page = get_page_or_404(file_name) 
    context = {'slug': slug, 'page': page} 
    translation.activate('en') # <------- Activate language EN 
    return render(request, 'page.html', context) 

コンテキストプロセッサは、コンテキスト言語を取得しようとしていると、それは明らかにNoneですので、それはあります。

更新

OK、knbkが言ったように、これは1.8のバグですので、あなたは、新しいバージョンにアップグレードする必要があります。..

+0

あなたはどちらも正しかった!あなたの答えは私が1.8にとどまりたいと仮定して動作します。ありがとう! – JellisHeRo

+1

@JellisHeRoありがとう、受け入れられたとしてknbkの答えを確認してください – doniyor

関連する問題