2011-12-16 13 views
6

私は何かを誤解しています!モデルが保存されていない場合、モデルに関連付けられているIDはありません。私はこのような何か持っているのであれば:モデルのフォームインスタンスはid = Noneを与えますDjango

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(...) 

views.py(挿入したり、既存の情報を編集することは同じのModelFormを使用しています)私はまた、イメージを持っているとのImageFieldためupload_to使用しています。 2つの問題があります。idはNoneで、instance=bookを操作して保存する方法がわからないので、実際にIDを取得します。 2番目の問題は、データを保存する場所が離れていることです。テンプレートタグbook.img.urlhttp:127.0.0.1:8000/folder1/media/id/での書籍の目的の場所を持っているにもかかわらず、実際の場所はどこか別の場所である:

idは、書籍IDで
/project/folder1/media/id/ 

:私は私の画像を保存したい

私は実際に何を得る:

/project/id/  

は私の前のコードが働い

(!しかし、 'idが' 'なし' が存在しないためになりません)。正しい場所に保存されますが、このコードでは動作しません。ですから、節約の問題は、それが以前に働いて以来、settings.pyが原因であるようには思えません。

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()はあなたがBookModelの保存されたインスタンスとしてsave_bookを使用することができ、そしてsave_book.idは、そのIDです。

+0

ありがとう!ええ、私はこのようなことを試みました。これはまだNoneフォルダを作成していますが、今回はidフォルダも作成しています。例えば、 'save_book.img.save( 'img'、request.FILES ['img'])'を実行すると、imgは/ Noneと/ 1に保存されます。 – sharkfin

4

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

ありがとうございます。私は条件付きのものを扱う方法が好きです(そのスタイルをコピーするつもりです、heh heh)。しかし、私はまだIDのための 'なし'を取得...私はそれがフォームが節約問題が原因で保存されるかもしれないと思う。私は古いコードに戻ったので、今のところ動作します。 – sharkfin

0

はデフ(例えば、some_idを= CREATE_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(送信者、例えば、* argsを、** kwargsから):

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

pre_save。connect(pre_save_post_receiver、送信者= Post)

+0

コードを書式化し、簡単な説明を追加してください。 –

関連する問題