2009-03-12 3 views

答えて

2

多くの点で、これに対するすべての解決策は、価値があるよりも問題になります。これはハックとしての資格があります。 create_updateの実装方法を変更すると、djangoのアップデートがあなたを高くして乾かしてしまう可能性があります。わかりやすくするために、私はデフォルトのユーザーを設定しようとしていますが、ユーザーを強制的にログインしたユーザーに強制しないと仮定します。

コンテキストプロセッサ書く:これは何をするか

from django.views.generic.create_update import get_model_and_form_class 
def form_user_default(request): 
    if request.method == 'GET': 
     model, custom_form = get_model_and_form_class(Post,None) 
     custom_form.author = request.user 
     return {'form':custom_form} 
    else: return {} 

はcreate_updateは、テンプレートに渡すフォームオブジェクトを上書きしています。技術的に何をしているのかは、デフォルトのビューがそれを行った後にフォームを再作成することです。あなたのURL confの中に続いて

url(r'pattern_to_match', 'django.views.generic.create_update.create_object', kwargs={'context_processors':form_user_default}) 

は再び、私はこれを行う方法を見つけ出すために、ソースコードを詳細に調べる必要がありました。あなた自身のビューを書くことを試みることが最も良いかもしれません(しかし、できるだけ多くのDjangoカスタムオブジェクトを組み込みます)。 djangoのパラダイム・フォームでは、ビューよりもモデル・レイヤーにより密接に関連し、ビューのみが要求オブジェクトの知識を持っているため、これを行うための「単純なデフォルト」の方法はありません。

1

ユーザが認証された場合、そのユーザオブジェクトはrequest.userオブジェクトです。

私はまだcreate_objectに慣れていません...私はまだdjangoの初心者で、最初の本当のプロジェクトを始めました。

これを使用する前に、ユーザーがログインしていることを確認する必要があります。これはrequest.user.is_authenticated()で行うことができます。

+0

私は知っている(ありがとうとにかく;))。私がしようとしているのは、このために新しいオブジェクトを保存するためのコードを書く必要がないため、汎用ビューを使用することです。 Djangoのコードは完全にテストされているので、可能な限り、自分のコードの代わりに使用する方が好きです。 –

0

現在のDjangoジェネリックビューを使用しているときに、オブジェクトの保存にフックする良い方法はありません。それらがrewritten as classesになると、ビューをサブクラス化し、適切な場所にフックすることができます。ビュー全体を書き直す必要はありません。

私はすでに自分のクラスベースの一般的なビューをこの理由で使用しています。

0

create_objectのラッパーを作成することをお勧めします。この著者は、ユーザー情報にアクセスできるようにビュー内に http://www.b-list.org/weblog/2006/nov/16/django-tips-get-most-out-generic-views/ を提案しています。 その後、extra_contextを使用してユーザーをテンプレートに渡す必要があります。最後にテンプレートでは、ユーザー情報とともに隠しフィールドを追加できます。私はそれを試していないが、私はかなりの時間それを考えていた。この解決策があなたに合ってほしいと思っています! ;)歓声!

3

閉鎖を検討することをお勧めします。

from django.forms import ModelForm 
from django.views.generic.create_update import create_object, update_object 

def make_foo_form(request): 
    class FooForm(ModelForm): 
     class Meta: 
      model = Foo 
      fields = ['foo', 'bar'] 

     def save(self, commit=True): 
      f = super(FooForm, self).save(commit=False) 
      if not f.pk: f.user = request.user 
      if commit: f.save() 
      return f 

    return FooForm 

def create_foo(request): 
    FooForm = make_foo_form(request) 
    return create_object(form_class=FooForm) 

ありますが、それぞれの要求に応じてのModelFormオブジェクトを作成する必要があるため、いくつかの非効率性は、ここにあるが、それはあなたが汎用ビューに機能を注入することができません。

フォームの作成に複雑さを加えることは、ビュー側でシンプルさを維持する価値があるかどうかを判断する必要があります。

ここでの利点は、しかし、これはまた、実質的に余分な労力で更新する場合に動作することである:明らかに

def update_foo(request, object_id): 
    FooForm = make_foo_form(request) 
    return update_object(form_class=FooForm, object_id=object_id) 

、あなたにも、より複雑な例については、このアプローチを使用することができます。

関連する問題