私は、各ビデオの横に小さな星が表示されるメディアサーバーに取り組んでいます。JQuery イベント ハンドラーがボタンにアタッチされているため、ボタンをクリックすると、サーバーのお気に入りページへの AJAX POST 要求が発生し、お気に入りに追加するビデオの一意の ID が送信されます。次に、JQuery は画像を切り替えます (お気に入りに設定されていない場合、クリックすると星が「光り」、お気に入りに設定されている場合、クリックすると星が再び透明になります)。
ユーザーがログインしていない場合、明らかに動画をお気に入りに登録できません。ユーザーがお気に入りボタンをクリックすると、ログインページにリダイレクトされるようにします。ただし、AJAX 応答は、認証されていないユーザーがお気に入りボタンをクリックすると、お気に入りボタンの画像が切り替わることを意味しますが、これは起こるべきではありません。問題は、JQuery 関数をショートサーキットし、ユーザーのログイン ステータスに基づいてトグルを防止する方法がわからないことです。
以下は私のお気に入りページで、POST リクエストが送信されます。
@login_required
def favorite(request):
if request.POST.has_key('id'):
id = request.POST['id']
id = id.rsplit('_')
id = int(id[1])
m = Media.objects.get(pk=id)
m.favorited_by.add(request.user.get_profile())
m.save()
if request.META.has_key('HTTP_REFERRER'):
return HttpResponseRedirect(request.META['HTTP_REFERRER'])
return HttpResponseRedirect('/')
そしてJQuery
var imgSRC={'src1':'/static/images/star_off.png','src2':'/static/images/star_on.png'};
$('.favorites').live('click', function() {
var img=$(this);
id=$(this).parent().parent().attr('id');
console.log(id);
$.post('/favorite/', {"id": id}, function(data) {
img.attr('src', imgSRC.src2);
img.attr('class', 'favorites_on');
});
});
編集:
JavaScriptをdjangoテンプレートに埋め込むのではなく、JavaScriptを独自のファイルに残すことをお勧めします。そのため、テンプレート タグをユーザー認証に使用することはできません。私が考えた1つの解決策は、ユーザーがログインしたときにのみ存在する一意のdivレイヤーを検索することでした(ユーザーの名前はログイン後にヘッダーの右上に表示されます)が、それでもこれを行うという私の問題は解決しません適切に、スクリプトをテンプレートから分離したままにします。