2016-09-13 3 views
1

Я изучаю Django, используя книгу Django-By-Example от Antonio Mele. На данный момент я достиг главы 5, и теперь я пытаюсь создать приложение для совместного использования изображений. Но, несмотря на следующие инструкции в этой главе, я получаю ImportError, когда пытаюсь добавить изображение из внешнего URL-адреса в сервер разработки django.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. Интересно, может ли эта проблема возникнуть из-за конфликта имен «request» между forms.py и views.py?

/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) 

с:

response = urllib2.urlopen(image_url) 

в вашем forms.py

Существует хорошая дискуссия о различиях между URLLIB и urllib2 здесь на этом SO post

+0

Спасибо, переключение на urllib2 исправляет ошибку – WaR1o

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