2012-12-18 7 views
21

匿名ユーザーデータを格納する私は、フォームの入力からユーザーおよび製品データを格納するDjangoのモデルがあります。もちろんDjangoは

def ProductSelection(request, template_name='product_selection.html'): 
    ... 
    if user.is_authenticated(): 
     user = request.user 
    else: 
     # deal with anonymous user info 
    project = Project.objects.create(
     user=user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"], 
    ) 

を、これは認証済みユーザーのための罰金ですが、私も匿名を保存できるようにしたいですユーザープロジェクトを作成し、可能であれば最終的に登録して認証するときにそれらをユーザーに関連付けます。

私の考えは、name = some_variable(ランダムなハッシュと連結したタイムスタンプ?)で匿名ユーザーを作成し、そのユーザー名をセッションデータに保存することです。そのセッション変数が存在する場合は、そのユーザーのすべてのプロジェクト活動を記録するために使用されることを確認すると、ユーザー登録時にユーザーの実際の資格情報でプロジェクトを更新できるはずです。

これは過度に複雑で脆弱ですか?何千もの行のデータを不必要に保存する危​​険がありますか?この共通の問題に対する最適なアプローチは何でしょうか?

これに関するガイダンスは非常に高く評価されます。

答えて

16

Django's session frameworkを使用して、匿名ユーザーデータを格納できます。

あなたは、その後、匿名ユーザーのためのsession_key値を保持するために、あなたのProjectモデルに

project = Project.objects.create(
    user=request.user, # can be anonymous user 
    session=request.session.session_key, 
    product=form.cleaned_data["product"], 
    quantity=form.cleaned_data["product_quantity"]) 

または単にプロジェクトのインスタンスがセッションに

if user.is_authenticated(): 
    project = Project.objects.create(
     user=request.user, 
     product=form.cleaned_data["product"], 
     quantity=form.cleaned_data["product_quantity"]) 
else: 
    # deal with anonymous user info 
    request.session['project'] = { 
     "product": form.cleaned_data["product"], 
     "quantity": form.cleaned_Data["product_quantity"]} 
を持つことになり、すべてのデータを格納するフィールドを追加しますか、

適切なユーザーを作成するときに、後でセッションからデータを取得できます。したがって、ユーザーフィールドはnullにすることができ

class Project(models.Model): 
    user = models.ForeignKey(User, null=True, blank=True) 
    ... 

、および:

 project = Project.objects.create(
      session=request.session.session_key, 
      # save all other fields 
      ... 
     ) 
     if request.user.is_authenticated(): 
      project.user = request.user 
     else: 
      # make a copy of the session key 
      # this is done because the session_key changes 
      # on login/ register 
      request.session['key_copy'] = request.session.session_key 
     project.save() 

そして、私のmodels.pyに:だけ明確にする

+0

私が過去に同様の問題に遭遇したとき、別の方向に戻る必要があるときに問題が発生します。ユーザーが複数のプロジェクトを持つことができ、どのセッションが2つの特定のプロジェクトを好きであったかなどのようにする必要がある場合 – JeffS

+0

私の場合、匿名ユーザーデータをdbに格納し、セッションを通じて特定のユーザーに関連付けることもしたいと考えています。 'user = request.user'が匿名ユーザオブジェクトを返した場合、後でこの情報を登録時にユーザに結びつけることはできません。 –

+1

その場合、私の最初の例では、 'session_key'値を保持するフィールドを追加し、匿名ユーザーが匿名で終わったときに、後で希望するProjectインスタンスを取得して新しいユーザーに関連付けることができます:-) –

7

、以下のコードは、私の場合、ソリューションを実装する方法ですこの例では、session_keyを使用して物事を追跡します。