0

私のアプリでは、ユーザーはプロファイルをリンクできます。サイトのすべてのページに表示されるサイドバーに、ユーザーがリンクされているプロファイルのユーザー名を表示したいと考えています。これまでのところ、プロファイルをリンクするために m2m フィールドを作成しました。ユーザーがログインすると、この情報をセッションに保存して、他のセッション情報とバンドルできるようにし、明示的に渡す必要がある別の変数を作成しません。各テンプレート。ただし、リンクされたプロファイルのリストにアクセスすると、プロファイルの ID にしかアクセスできず、プロファイルに関するその他の情報にはアクセスできません。

モデル

class Profile(models.Model):
    username = models.CharField(max_length=25)
    link = models.ManyToManyField('self', null=True, blank=True, related_name='link_profiles')

見る

def link_profiles(request, pid):
    #get both profiles
    my_p = Profile.objects.get(id=request.session['profile']['id'])
    their_p = Profile.objects.get(id=pid)

    #add profiles to eachothers links
    my_p.link.add(their_p)
    their_p.link.add(my_p)

    #save profiles
    my_p.save()
    their_p.save()

    #reset my session var to include the new link
    #this is that same bit of code that sets the session var when the user logs in
    request.session['profile'] = model_to_dict(my_p)

    return redirect('/profiles/' + pid)

テンプレート (pyjade を使用)

- for profile in session.profile.link
    div
        a(href="/profiles/{{ profile }}") profile {{ profile }}

これは のようなものを出力します<a href='/profiles/5'>profile 5</a>が、 を使用profile.idしてprofile.usernameに空白を入れるだけ<a href='/profiles/'>profile</a>です。別のセッション変数を作成せずにこの方法でこの情報にアクセスすることは可能ですか (たとえばrequest.session['links'])?

4

1 に答える 1

1

model_to_dict関連するオブジェクトのすべてのデータではなく、秘密鍵(ID)のリストのみを提供します。

つまり、関連する各オブジェクトを反復処理して、その「リンク」セッション変数を作成する必要があります。

request.session['links'] = [model_to_dict(link) for link in my_p.links.all()]

それを最適化したい場合は、セットを使用して、新しいプロファイルのみを追加できます。

data = model_to_dict(their_p)
if 'links' in request.session:
    request.session['links'].add(data)
else:
    request.session['links'] = set([data])

これでうまくいくはずですが、最善の方法ではないかもしれません。私は PyJade に慣れていませんが、返されたクエリセットをmy_p.links.all()コンテキスト内のテンプレートに渡し、代わりにそれを繰り返します。

とにかく、うまくいくことを願っています。

于 2013-10-31T21:43:14.520 に答える