Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

form instance of a model gives id=None Django

I'm misunderstanding something! If my model is not saved, it does not have an id associated with it. So if I have something like this:

views.py (inserting or editing existing info uses the same 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(...)

I also have an image and use upload_to for the imagefield. There are two problems: id is None and I'm not sure how to manipulate/save the instance=book so that I would actually get an id. The second problem is the location I save my data to is way off. Even though the template tag book.img.url has the desired location of the book at http:127.0.0.1:8000/folder1/media/id/, the actual location is somewhere else:

Where I want to save my image to:

/project/folder1/media/id/

where id is the book id.

What I actually get:

/project/id/      

(But 'id' becomes 'None' since it doesn't exist!)

My previous code worked. It would save to the correct location, but with this current code, it doesn't work. So the saving issue doesn't seem like it's due to settings.py since it worked previously.

EDIT: removed non-code from code formatting area

EDIT: I found out why I wasn't saving to the correct location. As it turned out, I forgot to uncomment something when I last modified settings.py. Saving to the location works now! Sorry guys!

EDIT: I think the id=None problem is caused by form.save(). If I avoid doing that and just save to the model directly, I don't have this problem.

like image 281
sharkfin Avatar asked Dec 16 '11 00:12

sharkfin


1 Answers

Id assigns only on saving objects when you use autoincrement id field (default). You can save item before handling image, and then save image.

May be you can not worry about image name - becouse django file storages dont have troubles with same image names. So if you just save file "image.png", and then save another file with name "image.png" - then it will be saved as "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()
like image 162
vsvasya Avatar answered Oct 11 '22 18:10

vsvasya