模型的表单实例给出id = None Django

时间:2011-12-16 00:54:09

标签: django django-forms

我误解了什么!如果我的模型未保存,则它没有与之关联的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.urlhttp: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()引起的。如果我避免这样做并直接保存到模型中,我就没有这个问题。

3 个答案:

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