我误解了什么!如果我的模型未保存,则它没有与之关联的ID。所以,如果我有这样的事情:
views.py
(插入或编辑现有信息使用相同的模型)
def insert_or_modify(request, id=None):
if id is not None:
book = BookModel.objects.get(pk=id)
else:
book = BookModel()
if request.method == 'POST':
form = BookInfoForm(request.POST, request.FILES, instance=book)
if form.is_valid():
form.save()
....
return render_to_response(...)
我还有一张图片,并使用upload_to作为图片字段。有两个问题:id是None,我不知道如何操纵/保存instance=book
以便我实际上得到一个id。第二个问题是我保存数据的位置是关闭的。即使模板标记book.img.url
在http:127.0.0.1:8000/folder1/media/id/
处具有所需的图书位置,但实际位置位于其他位置:
我想将图片保存到:
/project/folder1/media/id/
其中id
是图书ID。
我真正得到的是:
/project/id/
(但'id'变为'None',因为它不存在!)
我之前的代码有效。它将保存到正确的位置,但使用此当前代码,它不起作用。所以保存问题似乎不是由于settings.py,因为它以前工作。
编辑:从代码格式化区域中删除了非代码
编辑:我发现了为什么我没有保存到正确的位置。事实证明,当我上次修改settings.py时,我忘了取消注释。保存到位置现在工作!对不起伙计们!编辑:我认为id = None问题是由form.save()引起的。如果我避免这样做并直接保存到模型中,我就没有这个问题。
答案 0 :(得分:4)
当您使用autoincrement id字段时,Id仅分配保存对象(默认)。 您可以在处理图像之前保存项目,然后保存图像。
可能你不用担心图像名称 - 因为django文件存储没有相同图像名称的麻烦。因此,如果您只保存文件“image.png”,然后保存名为“image.png”的另一个文件 - 那么它将保存为“image_1.png”
def add_or_create(request, item_id=None):
item = get_object_or_404(BookModel, id=item_id) if item_id else None
form = BookInfoForm(request.POST or None, request.FILES or None, instance=book) # assume it is ModelForm
if form.is_valid():
book = form.save()
答案 1 :(得分:1)
第一部分:
def insert_or_modify(request, id=None):
if id:
book = BookModel.objects.get(pk=id)
if request.method == 'POST':
form = BookInfoForm(request.POST, request.FILES, instance=book)
if form.is_valid():
save_book = form.save()
# use save_book as your instance of BookModel
....
else:
if request.method == 'POST':
form = BookInfoForm(request.POST, request.FILES)
if form.is_valid():
save_book = form.save()
# use save_book as your instance of BookModel
....
save_book = form.save()
允许您使用save_book
作为已保存的BookModel实例,save_book.id
是其ID。
答案 2 :(得分:0)
def create_id(instance,some_id = None):
if some_id is None:
obj=Post.objects.first()
new_id=obj.id
new_id+=1
return new_id
else:
return some_id
def pre_save_post_receiver(sender,instance,* args,** kwargs):
if not instance.id:
instance.id = create_id(instance)
pre_save.connect(pre_save_post_receiver,sender = Post)