0

私の問題は、ユーザーが特定のモデル インスタンス、BlogSite を評価したかどうかを知る必要があることです。このページには、5 つ星の評価システムを持つ複数の BlogSite インスタンスがあります。現在のユーザーが特定のインスタンスを評価した場合、読み取り専用に設定する必要があります。

モデル関数を使用する場合、 current_user と BlogSite の 2 つの変数を渡す必要があるため、問題が発生しています。models.py で request.user にアクセスする方法を見つけることができませんでした。それを行うべきではないように見えますか?

私が行ったもう 1 つの方法は、カスタム フィルターを作成することでしたが、渡すことができるパラメーターは 1 つだけであることがわかりました。ロジックをviews.pyに保持した方が良いと思うので、私はむしろこのメソッドを実行したくありません

この問題を解決する方法を知っている人はいますか?

#models.py
class BlogSite(models.Model):
    #fields

#get the average rating for a blogsite
def rating_avg(self):
    rating_dict = BlogSiteReview.objects.filter(blog_site=self).aggregate(Avg('review_rating'))
    rating_avg = rating_dict.get('review_rating__avg')
    if rating_avg:
        return rating_avg
    else:
        #no ratings
        return 0

def rated(self, current_user):
    #If there is a row for the blogsitereview with this blogsite for the logged in user, return True, else False
    #can I access the current user? This does not work, seems like I can't get request here.
    current_user = request.user
    review = BlogSiteReview.objects.filter(blog_site=self, user=current_user)

    if review:
        return True
    else:
        return False

class BlogSiteReview(models.Model):
    blog_site = models.ForeignKey(BlogSite)
    user = models.ForeignKey(User)
    #other fields

ビューの関連部分は次のとおりです。

#views.py
def search(request, type, regionValue):
    #....
    #ideally, the solution would be to have a field or function in the BlogSite model
    blog_sites = BlogSite.objects.filter(country=region.id, active=True)
    #....

テンプレートでは、評価がTrueを返す場合にクラスを追加するifステートメントがあります

<tr>
    <td><a href="http://{{ blogsite.url }}" id="{{ blogsite.id }}">{{ blogsite.site_name }}</a></td>
    <td><div id="rating{{ blogsite.id }}" class="rating {% if blogsite.user_rated %}jDisabled{% endif %}" data-average="{{ blogsite.rating_avg }}" data-id="{{ blogsite.id }}"></div></td>
    <td>{{ blogsite.create_date }}</td>
</tr>

ここで 2 つのことを探しています。モデル メソッドを使用して、ユーザーが評価したかどうかを取得することは正しいアプローチのように思えますか? これまでのところ、models.py で使用する現在のユーザーにアクセスする方法が見つからないという問題があります。私が考えた別のアイデアは、何らかの方法でビューから request.current_user を渡すことですが、ユーザーは BlogSite に関連付けられていないため、それをフィルタリングすることはできません。

4

2 に答える 2

0

blog_site.rated(request.user)テンプレートパラメータを介して結果を渡すことができます。テンプレートに複数の BlogSite インスタンス (blog_sitesビュー サンプル内) をフィードし、それらをテンプレート内で反復処理する場合、次のようにインスタンスとrated結果をビュー内のタプルまたはディクテーションにグループ化できます。

({"site": block_site, "rated": block_site.rated(request.user)} for block_site in block_sites)

そして、それがテンプレート内の反復変数であると仮定して(ビューに名前を付けたため)、テンプレート内のこれらにそれぞれresult.siteアクセスします(テンプレートスニペットで置き換えます)。result.ratedresultsearchblogsite

したがって、私は個人的にrated、あなたが投稿したメソッドをcurrent_userパラメーターとともに保持します。

編集:これは、コード(質問と回答)と私の提案を組み合わせた例です:

#views.py
def search(request, type, regionValue):
    #....
    blog_sites = BlogSite.objects.filter(country=region.id, active=True)
    search_results = ({"site": block_site, "rated": block_site.rated(request.user)} for block_site in block_sites)
    return render(request, page, {..., 'search_results': search_results})

そしてテンプレートで:

{% for result in search_results %}
  {% with blogsite=result.site rated=result.rated %}
    <tr>
      <td><a href="http://{{ blogsite.url }}" id="{{ blogsite.id }}">{{ result.site.site_name }}</a></td>
      <td><div id="rating{{ blogsite.id }}" class="rating {% if rated %}jDisabled{% endif %}" data-average="{{ blogsite.rating_avg }}" data-id="{{ blogsite.id }}"></div></td>
      <td>{{ blogsite.create_date }}</td>
      <td>{{ rated }}</td>
    </tr>
  {% endwith %}
{% empty %}
  <p>There are no registered blogsites for this country.</p>
{% endfor %}
于 2013-10-27T18:23:24.343 に答える