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

sha*_*fin 6 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(...)
Run Code Online (Sandbox Code Playgroud)

我还有一个图像,并使用upload_to作为图像域.有两个问题:id是None,我不确定如何操作/保存,instance=book以便我实际上得到一个id.第二个问题是我保存数据的位置是关闭的.即使模板标签book.img.url具有所需的书籍http:127.0.0.1:8000/folder1/media/id/位置,实际位置也位于其他位置:

我想将图像保存到的位置:

/project/folder1/media/id/
Run Code Online (Sandbox Code Playgroud)

id书的ID 在哪里.

我真正得到的是:

/project/id/      
Run Code Online (Sandbox Code Playgroud)

(但'id'变为'None',因为它不存在!)

我以前的代码工作.它将保存到正确的位置,但使用此当前代码,它不起作用.所以保存问题似乎不是由于settings.py,因为它以前工作.

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

编辑:我发现了为什么我没有保存到正确的位置.事实证明,当我上次修改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
        ....
Run Code Online (Sandbox Code Playgroud)

save_book = form.save()允许您用作save_book保存的 BookModel 实例,并且save_book.id是它的 id。