2011-12-16 59 views
6

我误解了一些东西!如果我的模型没有保存,它没有与它关联的ID。所以,如果我有这样的事情:一个模型的实例给出id = None Django

views.py(插入或编辑现有的信息使用相同的ModelForm)

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为的ImageField。有两个问题: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/  

(但 '身份证' 成为 '无',因为它不存在!)

我以前的代码工作。它会保存到正确的位置,但使用当前的代码,它不起作用。所以保存问题似乎并不像settings.py那样是因为它以前有效。

编辑:删除从代码格式化区域

EDIT非代码:我发现我为什么不能保存到正确的位置。事实证明,当我上次修改settings.py时,我忘了取消注释。现在保存到该位置即可使用!对不起大家!

编辑:我认为id = None问题是由form.save()引起的。如果我避免这样做,直接保存到模型中,我就没有这个问题。

回答

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。

+0

谢谢!是的,我尝试了这样的事情。它仍然创建None文件夹,但是这次它也创建了id文件夹。例如,如果我执行`save_book.img.save('img',request.FILES ['img'])`,img将被保存在/ None和/ 1中。 – sharkfin 2011-12-16 02:28:21

4

当您使用autoincrement id字段(默认值)时,Id仅分配给保存对象。 您可以在处理图像之前保存项目,然后保存图像。

可能是你不能担心图像名称 - becouse 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

谢谢。我喜欢你处理有条件的东西(会复制那种风格,嘿嘿)。但我仍然得到“无”ID ...我认为这可能是当表单保存导致None问题。我恢复了我的旧代码,所以它现在可以工作。 – sharkfin 2011-12-16 19:39:34

0

高清create_id(例如,SOME_ID =无):

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(发件人,例如,*指定参数时,** kwargs):

if not instance.id: 
    instance.id = create_id(instance) 

pre_save。连接(pre_save_post_receiver,发件人=发布)

+0

请格式化您的代码并添加简短说明。 – 2016-08-12 08:41:56

相关问题