2011-12-16 2 views
6

Я что-то недопонимаю! Если моя модель не сохранена, у нее нет идентификатора, связанного с ней. Так что, если у меня есть что-то вроде этого:Форма экземпляра модели дает 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, чтобы я действительно получил идентификатор. Вторая проблема заключается в том, что местоположение, в котором я сохраняю свои данные, находится далеко. Даже при том, что шаблонный тег book.img.url имеет нужное место книги в http:127.0.0.1:8000/folder1/media/id/, фактическое место находится где-то еще:

Где я хочу сохранить мое изображение, чтобы:

/project/folder1/media/id/ 

где id книга идентификатор.

То, что я на самом деле получить:

/project/id/  

(А 'идентификатор' становится 'None', так как он не существует!)

Мой предыдущий код работал. Он сохранит в правильном месте, но с этим текущим кодом это не сработает. Поэтому проблема с сохранением не похоже, что это связано с параметрами settings.py, поскольку она работала ранее.

EDIT: удален не-код с кодом города, форматирование

EDIT: Я узнал, почему я не экономил на правильное место. Как оказалось, я забыл раскомментировать что-то, когда я в последний раз модифицировал settings.py. Сохранение местоположения теперь работает! Извините ребята!

EDIT: Я думаю, что проблема 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 является его идентификатор.

+0

Спасибо! Да, я пробовал что-то вроде этого. Он по-прежнему создает папку «Нет», но на этот раз он также создает папку id. Например, если я делаю 'save_book.img.save ('img', request.FILES ['img'])', img будет сохранен в/None и/1. – sharkfin

4

Идентификатор присваивается только при сохранении объектов при использовании поля идентификатора автоинкремента (по умолчанию). Вы можете сохранить элемент перед обработкой изображения, а затем сохранить изображение.

Возможно, вы не можете беспокоиться о названии изображения - becouse django files storage dont have troubles with the same images names. Так что если вы просто сохранить файл «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 ... Я думаю, может быть, когда форма сохраняет, что вызывает проблему «Нет». Я вернулся к своему старому коду, так что теперь он работает. – sharkfin

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 

защиту pre_save_post_receiver (отправитель, экземпляр, * арг, ** kwargs):

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

pre_save.connect (pre_save_post_receiver, sender = Post)

+0

Пожалуйста, отформатируйте свой код и добавьте краткое объяснение. –

Смежные вопросы