2012-11-11 1 views
3

11 개의 필드와 하나의 이미지 업로드 필드가있는 양식이 있습니다. 채우기 및 제출 후, 정수가 필요하다는 TypeError가 주어집니다. imagefield를 제거하면이 오류가 발생하지 않습니다. 이미지 디렉토리를 확인하면 오류가 발생하기 전에 파일이 서버에 저장됩니다.Django form.save에 "TypeError : 정수가 필요합니다"

Forms.py :

class ListingForm(ModelForm): 
    seller_email = forms.EmailField(max_length="", required=True, widget=forms.TextInput(attrs={'placeholder': "[email protected]"})) 
    title = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder':"The Cat in the Hat"})) 
    edition = forms.IntegerField(required=True, widget=forms.TextInput(attrs={'placeholder':"5"})) 
    author = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder':"Dr. Seuss"})) 
    isbn = forms.CharField(label="ISBN", required=True, widget=forms.TextInput(attrs={'placeholder':"9780717260591"})) 
    price = forms.FloatField(required=True, widget=forms.TextInput(attrs={'type':"number", 'placeholder':"50.00"})) 
    classcode= forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder':"MA115"})) 
    #description = forms.CharField(widget=forms.TextArea(attrs={'placeholder':"You should buy this because..."})) 
    condition = forms.ChoiceField(required=True, widget=forms.Select(), choices=([(4,"New"), (3,"Good"), (2,"Fair"), (1,"Poor")])) 
    seller_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder':"John Doe"})) 
    seller_phone = forms.CharField(widget=forms.TextInput(attrs={'placeholder':"(555) 555-1234"})) 

    picture = forms.ImageField(widget=forms.FileInput('accept':"image/*")) 
    #picture = forms.ImageField() 
    uuid = forms.CharField(widget=forms.HiddenInput(), initial=uuid.uuid4()) 
    timeposted = forms.CharField(widget=forms.HiddenInput(), initial=datetime.now()) 
    sale_status = forms.BooleanField(widget=forms.HiddenInput(), initial=True) 



    class Meta: 
     model = Listing 
     fields = ('seller_email', 'title', 'edition', 'author', 'isbn', 'price', 'classcode', 'description', 'condition', 'seller_name', 'seller_phone', 'picture', 'uuid', 'timeposted', 'sale_status') 
     #exclude = ("uuid", "timeposted", "sale_status", "picture", "school") 

Views.py :

Environment: 



Request Method: POST 
Request URL: http://alligator.collegebooktrade.info/listings/add/ 

Django Version: 1.4 
Python Version: 2.7.3 
Installed Applications: 
('django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.sites', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'django.contrib.admin', 
'cbt.accounts', 
'cbt.listings') 
Installed Middleware: 
('django.middleware.common.CommonMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware') 


Traceback: 
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response 
    111.       response = callback(request, *callback_args, **callback_kwargs) 
File "/home/cbt/cbt/listings/views.py" in add 
    25.   form.save() 
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in save 
    364.        fail_message, commit, construct=False) 
File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py" in save_instance 
    86.   instance.save() 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" in save 
    463.   self.save_base(using=using, force_insert=force_insert, force_update=force_update) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" in save_base 
    551.     result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in _insert 
    203.   return insert_query(self.model, objs, fields, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in insert_query 
    1576.  return query.get_compiler(using=using).execute_sql(return_id) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py" in execute_sql 
    909.   for sql, params in self.as_sql(): 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py" in as_sql 
    872.     for obj in self.query.objs 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py" in pre_save 
    249.    file.save(file.name, file, save=False) 
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py" in save 
    86.   self.name = self.storage.save(name, content) 
File "/usr/local/lib/python2.7/dist-packages/django/core/files/storage.py" in save 
    45.   name = self._save(name, content) 
File "/usr/local/lib/python2.7/dist-packages/django/core/files/storage.py" in _save 
    212.    os.chmod(full_path, settings.FILE_UPLOAD_PERMISSIONS) 

Exception Type: TypeError at /listings/add/ 
Exception Value: an integer is required 

편집 : 요청으로 :

Model: 
class Listing(models.Model): 
title = models.CharField(max_length="100") 
edition = models.CharField(max_length="5") 
author = models.CharField(max_length="50") 
isbn = models.CharField(max_length="13") 
price = models.FloatField() 
classcode = models.CharField(max_length="12") 
description = models.CharField(max_length="400") 
condition = models.CharField(max_length="10") 
#school = models.OneToOneField(School) 
school = models.CharField(max_length="36") 

picture = models.ImageField(upload_to="listings") 

#CONTACT INFO: 
seller_name = models.CharField(max_length="30") 
seller_phone = models.CharField(max_length="11") 
seller_email = models.EmailField(max_length="75") 

uuid = models.CharField(max_length="36") 
timeposted = models.DateTimeField() 
sale_status = models.BooleanField() #0 for sale, 1 for sold 
다음
from django.shortcuts import render_to_response, get_object_or_404 
from django.http import HttpResponseRedirect, HttpResponse 
from django.core.urlresolvers import reverse 
from django.template import Context, loader, RequestContext 
from django.contrib.auth.models import User 
from cbt.accounts.models import School, UserProfile 
from cbt.listings.models import Listing 
from django.contrib import auth 
from django.core.context_processors import csrf 
from django.core.mail import send_mail 
from django.core.files import File 
from datetime import datetime 
from cbt.settings import MEDIA_ROOT 
from cbt.listings.forms import ListingForm 

school_list = School.objects.all().order_by('name') 

def add(request): 

    form = ListingForm() 
    if request.method == 'POST': 
     form = ListingForm(request.POST, request.FILES) 
     if form.is_valid() and form.is_multipart(): 
      form.save() 
      return HttpResponseRedirect(reverse('cbt.views.home'))  

    return render_to_response('listings/add.html', {'school_list':school_list, 'form':form}, context_instance=RequestContext(request)) 

정확한 오류 코드입니다 0

Settings.py :

FILE_UPLOAD_PERMISSIONS '0760' 

그것은 그것의 주위에 따옴표를하지 말았어야 : 당신의 settings.py 스크립트에서

#just including pertinent settings... 
FILE_UPLOAD_PERMISSIONS '0760' 
FILE_UPLOAD_HANDLERS ('django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler') 
MIDDLEWARE_CLASSES ('django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware') 
FILE_UPLOAD_MAX_MEMORY_SIZE '2621440' 
+2

이미지 필드에 upload_to 속성을 올바르게 설정 했습니까? 디렉토리가 올바른 권한으로 존재합니까? 이 예외는 설정의 가치가 무엇이든 거의 확실하게 발생합니다 .FILE_UPLOAD_PERMISSIONS가 있습니다. 모델 및 해당 필드의 구성을 포함하면 도움이됩니다. – BenTrofatter

답변

4

, 당신은이 라인을 가지고있다. 정수를 예상 할 때 문자열을 두 번째 인수로 사용하여 os.chmod()를 호출하려고합니다. 특히, 8 진 권한 값. 파이썬에서 선행 0이있는 숫자는 자동으로 8 진수 값으로 간주되어 정수로 변환됩니다. 따라서이 줄을 대신 사용하십시오 :

FILE_UPLOAD_PERMISSIONS = 0760 

그런데 왜 당신은 settings.py에서 등호를 사용하지 않습니까?

+0

감사! 나는 에러 페이지에서 복사했는데, 등호 대신에 탭을 사용하여 형식을 지정했다. – user1816805