2011-12-16 25 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

相關問題