7

2つの別々のビュー関数(add / edit:)からトリガーされた製品を追加/編集するためのフォーム(フィールド'user'はユーザーの外部キー)があるとします。

def product_add(request):
    userprofile = UserProfile.objects.get(user=request.user)
    if request.method == 'POST':
        form = ProductAddForm(request.POST, request.FILES,)
        if form.is_valid():
            form.save(user=request.user)
    else:
        form = ProductAddForm()
    return render_to_response('products/product_add.html', {
            'form':form, 'user':request.user,
            }, context_instance=RequestContext(request))

def product_edit(request, id):
    product = get_object_or_404(Product, id=id, user=request.user)
    if product.user.id!=request.user.id:
        raise Http404
    if request.method == 'POST':
        form = ProductAddForm(request.POST, request.FILES, instance=product)
        if form.is_valid():
            form.save(user=request.user)            
    else:
        form = ProductAddForm(instance=product)
    return render_to_response('products/product_edit.html', {
            'form':form, 'user':request.user,
            }, context_instance=RequestContext(request))

フォームのsaveメソッドは次のようになります。

def save(self, user, *args, **kwargs):
    self.instance.user = user                           
    post = super(ProductAddForm, self).save(*args, **kwargs)
    post.save()

誰かがこのsaveメソッドで何が起こっているのかを段階的に教えてもらえますか?このフォームでsuperを呼び出すのはなぜですか?関数呼び出しが同じ場合、新製品を編集して保存するときの処理全体の違いは何ですか?

4

1 に答える 1

3

self.instance.user=ユーザー

user引数をself.instanceオブジェクトのuser属性に保存します

post = super(ProductAddForm、self).save(* args、** kwargs)

スーパークラスのsaveメソッドを呼び出して、結果のオブジェクトを取得します。

post.save()

結果のオブジェクトを保存します。の引数によっては、これは不要な場合もあれば、必須の場合もありますsave

http://docs.djangoproject.com/en/1.2/topics/forms/modelforms/#the-save-methodを参照してください。commitがFalseの場合、postオブジェクトはデータベースに保存されていません。

于 2010-07-01T02:15:11.673 に答える