2012-11-11 25 views
3

我有一个表单有11个字段和一个图像上传字段。填写完毕并提交后,我得到一个TypeError,表示需要一个整数。如果我删除了imagefield,则不会出现此错误。检查图像目录,在引发错误之前将文件保存到服务器。Django“TypeError:一个整数是必需的”form.save

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:

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

这里是确切的错误代码:

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 

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属性,并且目录是否存在正确的权限?这个异常几乎肯定来自settings.FILE_UPLOAD_PERMISSIONS的值。在模型及其字段中包含配置将会很有帮助。 – BenTrofatter

回答

4

在你的settings.py脚本,你有这样一行:

FILE_UPLOAD_PERMISSIONS '0760' 

它不应该有周围的引号。当它期望一个整数时,你试图用一个字符串作为第二个参数来调用os.chmod()。具体来说,八进制权限值。在Python中,具有前导0的数字被自动视为八进制值并被转换为整数。所以,只要使用此行:

FILE_UPLOAD_PERMISSIONS = 0760 

顺便说一句,你为什么不使用等于在你的settings.py迹象?

+0

谢谢!我是,我从错误页面复制了它,而不是等号,它使用制表符来格式化 – user1816805

相关问题