2016-09-13 13 views
1

私はDjangoを、Django-By-Exampleの本をAntonio Meleが使って学んでいます。今のところ、私は第5章に達しました。そして今、私は画像共有アプリを作成しようとしています。しかし、その章のすべての指示に従っても、私はdjango開発サーバーの外部URLからイメージを追加しようとすると、ImportErrorを取得しています。Django ImportErrorは名前のリクエストをインポートできません

ImportError at /images/create/ 

cannot import name request 

Request URL: http://127.0.0.1:8000/images/create/?title=%20Django%20and%20Duke&url=http://upload.wikimedia.org/wikipedia/commons/8/85/Django_Reinhardt_and_Duke_Ellington_(Gottlieb).jpg. 
Django Version:  1.8.6 
Exception Location:  /home/ciotar/projects/VirtualEnvs/env/bookmarks/bookmarks/images/forms.py in <module>, line 1 
Python Version:  2.7.11 

私はPycharmを使用しており、python 3.5インタープリタをアクティブなvirtualenvインスタンスから設定しています。なぜDjangoがPython 2.7で動作するのかよく分かりません。 forms.pyとviews.pyモジュールの間に 'request'という名前の衝突があるため、この問題が発生する可能性がありますか?

/images/urls.py

urlpatterns = [ 
    url(r'^create/$', views.image_create, name='create'), 
] 

/images/views.py

from django.shortcuts import render, redirect 
from django.contrib.auth.decorators import login_required 
from django.contrib import messages 
from .forms import ImageCreateForm 


@login_required 
def image_create(request): 
    """ 
    View for creating an Image using the JavaScript Bookmarklet. 
    """ 
    if request.method == 'POST': 
     # form is sent 
     form = ImageCreateForm(data=request.POST) 
     if form.is_valid(): 
      # form data is valid 
      cd = form.cleaned_data 
      new_item = form.save(commit=False) 
      # assign current user to the item 
      new_item.user = request.user 
      new_item.save() 
      messages.success(request, 'Image added successfully') 
      # redirect to new created item detail view 
      return redirect(new_item.get_absolute_url()) 
    else: 
     # build form with data provided by the bookmarklet via GET 
     form = ImageCreateForm(data=request.GET) 

    return render(request, 'images/image/create.html', {'section': 'images', 
                 'form': form}) 

/images/forms.py

from urllib import request 
from django.core.files.base import ContentFile 
from django.utils.text import slugify 
from django import forms 
from .models import Image 


class ImageCreateForm(forms.ModelForm): 

    class Meta: 
     model = Image 
     fields = ('title', 'url', 'description') 
     widgets = { 
      'url': forms.HiddenInput, 
     } 

    def clean_url(self): 
     url = self.cleaned_data['url'] 
     valid_extensions = ['jpg', 'jpeg'] 
     extension = url.rsplit('.', 1)[1].lower() 
     if extension not in valid_extensions: 
      raise forms.ValidationError('The given URL does not match valid image extensions.') 
     return url 

    def save(self, force_insert=False, force_update=False, commit=True): 
     image = super(ImageCreateForm, self).save(commit=False) 
     image_url = self.cleaned_data['url'] 
     image_name = '{}.{}'.format(slugify(image.title), 
            image_url.rsplit('.', 1)[1].lower()) 

     # download image from the given URL 
     response = request.urlopen(image_url) 
     image.image.save(image_name, 
         ContentFile(response.read()), 
         save=False) 

     if commit: 
      image.save() 
     return image 

答えて

3

これは、Pythonの不一致に起因していますバージョン。

のPython 2.7では、あなたは交換する必要がある場合があります:

from urllib import request 

をごforms.py

import urllib2 

で再びurllib2 > Requestモジュールはurlopenメソッドを持っていません。あなたがラインに

response = request.urlopen(image_url) 

を交換する必要がありますので:あなたのforms.py

response = urllib2.urlopen(image_url) 

このSO post

+0

にここurllibはとurllib2の違いについての素敵な議論がありますありがとう、urllib2に切り替えるとエラーが修正されます – WaR1o

関連する問題