在 Django 中创建对象时使用 upload_to 函数
use of upload_to function when creating on object in django
这是我在 django 中的模型:
import os
def upload_location_buy(instance, filename):
ext = filename.split('.')[-1]
filename = '%s.%s' % (instance.name+"_"+str(random.randint(1000, 9999)), ext)
print(os.path.join('uploads', filename))
return os.path.join('uploads', filename)
class Buy(models.Model):
pic_front = models.ImageField(blank=True, upload_to=upload_location_buy,default='')
当我尝试时:
b = Buy(pic_front="appartement_a.jpg")
b.save()
除了在当前路径中链接当前图片外,它什么都不做,所以不使用模型中的函数。
当我这样做时:
b = Buy(pic_front=upload_location_buy("appartement_a.jpg"))
b.save()
它给我一个错误,因为它似乎需要实例。
TypeError: upload_location_buy() missing 1 required positional
argument: 'filename'
如何创建一个购买对象,给它一张图片并使用 upload_location_buy 在没有管理员的情况下做这件事?
当我在管理员中上传图片时它有效。
如何给它实例名或正确地做?
这是这个脚本:
import sys
import os
import django
from django.core.exceptions import ObjectDoesNotExist
sys.path.append("../../../testproject")
os.environ["DJANGO_SETTINGS_MODULE"] = "testproject.settings"
django.setup()
from on_plan.models import Buy
Buy.objects.all().delete()
b = Buy(pic_front=upload_location_buy("appartement_a.jpg"))
b.save()
该脚本与文件“appartement_a.jpg”位于同一目录中。
-on_plan/
-testproject/
-import_script.py
-appartement_a.jpg
-manage.py
如果我做一个:
file_to_save = open('appartement_a.jpg', 'r').read()
b = Buy(pic_front=file_to_save)
b.save()
我有一个:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
如果我做一个:
file_to_save = open('appartement_a.jpg', 'rb').read()
b = Buy(pic_front=file_to_save)
b.save()
我有一个:
AttributeError: 'bytes' object has no attribute '_committed'
解决方法在这里:
import requests
import urllib.parse
import sys
import os
import django
import csv
import time
import random
from django.core.exceptions import ObjectDoesNotExist
sys.path.append("../../../sample_estate")
os.environ["DJANGO_SETTINGS_MODULE"] = "sample_estate.settings"
django.setup()
from django.core.files.base import File
from on_plan.models import Buy
file_to_save = open('appartement_a.jpg', 'rb')
b = Buy(pic_front=File(file_to_save))
b.save()
当您创建一个 Buy
对象时,您需要将文件对象传递给 pic_front 属性,但您尝试只传递文件名。
from django.core.files.base import File
file_to_save = open('/path/to/appartement_a.jpg', 'r').read()
b = Buy(pic_front=File(file_to_save))
b.save()
如果您从表单中获取文件,您可以这样上传:
b = Buy(pic_front=request.FILES['file'])
b.save()
无论如何pic_front
希望得到一个文件对象而不是字符串
More about this case
这是我在 django 中的模型:
import os
def upload_location_buy(instance, filename):
ext = filename.split('.')[-1]
filename = '%s.%s' % (instance.name+"_"+str(random.randint(1000, 9999)), ext)
print(os.path.join('uploads', filename))
return os.path.join('uploads', filename)
class Buy(models.Model):
pic_front = models.ImageField(blank=True, upload_to=upload_location_buy,default='')
当我尝试时:
b = Buy(pic_front="appartement_a.jpg")
b.save()
除了在当前路径中链接当前图片外,它什么都不做,所以不使用模型中的函数。
当我这样做时:
b = Buy(pic_front=upload_location_buy("appartement_a.jpg"))
b.save()
它给我一个错误,因为它似乎需要实例。
TypeError: upload_location_buy() missing 1 required positional argument: 'filename'
如何创建一个购买对象,给它一张图片并使用 upload_location_buy 在没有管理员的情况下做这件事?
当我在管理员中上传图片时它有效。
如何给它实例名或正确地做?
这是这个脚本:
import sys
import os
import django
from django.core.exceptions import ObjectDoesNotExist
sys.path.append("../../../testproject")
os.environ["DJANGO_SETTINGS_MODULE"] = "testproject.settings"
django.setup()
from on_plan.models import Buy
Buy.objects.all().delete()
b = Buy(pic_front=upload_location_buy("appartement_a.jpg"))
b.save()
该脚本与文件“appartement_a.jpg”位于同一目录中。
-on_plan/
-testproject/
-import_script.py
-appartement_a.jpg
-manage.py
如果我做一个:
file_to_save = open('appartement_a.jpg', 'r').read()
b = Buy(pic_front=file_to_save)
b.save()
我有一个:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
如果我做一个:
file_to_save = open('appartement_a.jpg', 'rb').read()
b = Buy(pic_front=file_to_save)
b.save()
我有一个:
AttributeError: 'bytes' object has no attribute '_committed'
解决方法在这里:
import requests
import urllib.parse
import sys
import os
import django
import csv
import time
import random
from django.core.exceptions import ObjectDoesNotExist
sys.path.append("../../../sample_estate")
os.environ["DJANGO_SETTINGS_MODULE"] = "sample_estate.settings"
django.setup()
from django.core.files.base import File
from on_plan.models import Buy
file_to_save = open('appartement_a.jpg', 'rb')
b = Buy(pic_front=File(file_to_save))
b.save()
当您创建一个 Buy
对象时,您需要将文件对象传递给 pic_front 属性,但您尝试只传递文件名。
from django.core.files.base import File
file_to_save = open('/path/to/appartement_a.jpg', 'r').read()
b = Buy(pic_front=File(file_to_save))
b.save()
如果您从表单中获取文件,您可以这样上传:
b = Buy(pic_front=request.FILES['file'])
b.save()
无论如何pic_front
希望得到一个文件对象而不是字符串
More about this case