6

Djangoサイトに星評価システムを実装しようとしています。

ページにスコアを表示するのと同様に、モデルに評価を保存することもソートされています。しかし、ページを更新したり変更したりせずに、ユーザーがページを(基本的に1から5まで)評価できるようにしたいと思います。

私は以下を見つけました、そしてここの星のスタイルが好きです:http: //jvance.com/blog/2008/09/22/JQueryRaterPluginNew.xhtml

現在、javascriptとAJAXについての理解は限られています。上記の例の星をAJAXとDjangoと組み合わせて使用​​する方法を知っている人はいますか?ユーザーが評価を選択したときにページを更新せずにデータベース(モデル)を更新できますか?

また、ユーザーが投票できるのは1回だけである、つまり、ページを2回評価することは許可されていないことも重要です。モデルには、すでに投票したかどうか、および以前の投票が何であったかが保存されます。しかし、これを表示するために星をどのように変更できますか?


したがって、これらの方法、より適切な星評価グラフィックソリューション、または優れたチュートリアルを知っている場合は、共有してください。ありがとうございました。

4

3 に答える 3

10

AJAXは恐ろしくて紛らわしいように聞こえますが、そうである必要はありません。基本的にあなたがしたいことは、特定のURL/ビューコンボにいくつかのデータを投稿することです。AJAXを使用してサーバーにデータを送信する方法の詳細については、 jQuery.postを参照してください。

#urls
urlpatterns += patterns('',
url(r'^article/rate/', 'article.rate'),

#views 
def rate(request):
    if request.method == 'POST':
       # use post data to complete the rating..

#javascript
$.post("/article/rate", { rating: 3, article: 2 },
    function(data) {
       // success! so now set the UI star to 3
});

私の知る限り、星評価はラジオコントロールとcssで生成されます。したがって、ページの読み込み時にユーザーごとの現在の評価を表示する場合は、テンプレートにcheckedオプションを使用して関連するラジオをレンダリングさせるだけです。

于 2011-02-12T23:30:45.993 に答える
4

ジョナサンあなたはジャンゴの世界へようこそ。Djangoはクールなフレームワークであるため、一部のdjangonautsは私たちを支援するための素晴らしいサイトを作成しています。

http://djangopackages.com/categories/apps/にアクセスして「評価」を検索すると、プロジェクトで大いに役立つ例を含むいくつかのdjangoプラガブルが見つかります。

また、別の質問でこれらのutilの回答を参照してください:ベストプラクティス:DjangoテンプレートでRating-Starsを最適に実装する方法

于 2011-02-12T20:02:10.237 に答える
1

最近これに取り組んでいるので、私はミックスの解決策を提供すると思いました。まず、RateItを使用しています。これは、セットアップが非常に簡単で、非常に直感的に使用できることがわかりました(RateIt*.js.*cssファイルをbase.htmlテンプレートに追加します)。

http://www.radioactivethinking.com/rateit/example/example.htm

これが私のソリューションの重要な部分です。

urls.py

url(r'^object/rate/$', RateMyObjectView.as_view(), name='rate_my_object_view'),

my_template.html

<div class="rateit" data-rateit-resetable="false">Rate it!</div>

ajax.js

$('.rateit').bind('click', function(e) {

    e.preventDefault();

    var ri = $(this);
    var value = ri.rateit('value');
    var object_id = ri.data('object_id');

    $.ajax({
        url: '/object/rate/?xhr',
        data: {
            object_id: object_id,
            value: value
        },
        type: 'post',
            success: function(data, response) {
            console.log("ajax call succeeded!");
        },
            error: function(data, response) {
            console.log("ajax call failed!");
        }
    });
});

一部のビュービットはJamesBennettからのものxhrです(たとえば、設定)。

http://www.b-list.org/weblog/2006/jul/31/django-tips-simple-ajax-example-part-1/

views.py

from django.views.generic.base import View
from .models import MyObject

class RateMyObjectView(View):

    def post(self, request):

        my_object = MyObject.objects.all().last()

        xhr = 'xhr' in request.GET
        star_value = request.POST.get('value', '')

        my_object.score = star_value
        my_object.save()

        response_data = {
            'message': 'value of star rating:',
            'value': star_value
        }

        if xhr and star_value:
            response_data.update({'success': True})

        else:
            response_data.update({'success': False})

        if xhr:
            return HttpResponse(json.dumps(response_data), content_type="application/json")

        return render_to_response(self.template_name, response_data)

models.py

from django.db import models

class MyObject(models.Model)
    score = models.FloatField(max_length=1, default=0)

これは単純な解決策であり、オブジェクトリストの最後の項目の現在のスタースコアを置き換えるだけであることに注意してください。スコアを独自のモデルとして保存し、オブジェクトにリンクする方がよいため、理想的ではありません。これは、それらを保存して平均などの計算を行うことができるということでした。私は現在これに取り組んでおり、終了したらこの回答を更新します。

于 2015-02-07T23:34:38.857 に答える