0

ユーザーに関連付けられた画像を適切に表示しようとしています。テンプレートに何を含めるべきかを判断するのに助けが必要です。具体的には、テンプレート「{{review.user__image}}」のコードが間違っていると思います。特定のレビューとそのレビューを書いたユーザーに基づいて、ユーザーに関連付けられた画像を取得するにはどうすればよいですか?

ビュー.py

def view_reviews(request, product_name):
    product = get_object_or_404(Productbackup, url_friendly=product_name)
    product_id = product.id
    reviews = Reviewbackup.objects.filter(product_id=product_id).order_by("-created_on")
    return render_to_response('reserve/templates/view_reviews.html', {'reviews':reviews},
        context_instance=RequestContext(request))

models.py

class Reviewbackup(models.Model):
    review = models.CharField('Review', max_length = 2000)
    user = models.CharField('Username', max_length =  200)
    rating = models.IntegerField(max_length=2, choices=RATING_OPTIONS)
    product = models.ForeignKey(Productbackup)
    def __unicode__(self):
        return self.review

class UserProfile(models.Model):
    user = models.ForeignKey(User, primary_key=True)
    image = models.ImageField(blank=True, null=True, max_length=255, upload_to="images/")

テンプレート

{% for review in reviews %} 
    <br><a href = "/user/{{review.user}}/">{{review.user}}</a><br>
    <img class = "thumbnail" src = "http://test.webfactional.com/static/{{review.user__image}}"><br>
    {{review}}
{% endfor %}
4

3 に答える 3

1

長い回答で申し訳ありません。あなたのコードから判断すると、あなたは Django を初めて使うと思います。そのため、この回答が有益であり、プロセスの回答の質問でも役立つことを願っています。

ユーザー

レビュー モデルでは、ではなく にするuser必要があります。特にデータベーステーブルを自分で見る場合は、ユーザー名を保存する方が自然に思えることは理解していますが、そのアプローチはエラーが発生しやすく、非常に正当な理由がない限り、悪いことです。ForeignKeyCharField

ユーザー名が のユーザーがいるとしますfoousername。次に、そのユーザーがいくつかのレビューを作成します。したがって、この時点で、userフィールドがfoousername. ユーザーが自分のユーザー名を に変更したい場合、someotherfoousernameレビューとユーザーの間のリンクを壊さないようにするためにuser、ユーザーが作成したすべてのレビューのフィールドを新しいユーザー名を使用するように変更する必要があります。これは余分な手順であり、忘れる可能性があるため、エラーが発生しやすくなります。を使用ForeignKeyすると、この問題はすぐに解決されます。ユーザーがユーザー名を変更しても、ユーザーのプライマリ ID は変更されないため、レビューがプライマリ キー (外部キー) にリンクしている場合、レビューを更新する必要はありません。そのため、作業が少なく、より信頼性の高い方法です。

これを行います(次に説明しますrelated_name):

user = models.ForeignKey(User, related_name='reviews')

related_name

を使用しているときrelated_name、Django はあなたの生活をずっと楽にしてくれます。

あなたの見解を考慮してください。まず、製品を照会します。次に、それを取得したら、その ID を取得して、その製品のすべてのレビューを返すクエリを作成します。Django を使用すると、はるかに少ないコードでこれらすべてを実行できます。

product = get_object_or_404(Productbackup, url_friendly=product_name)
reviews = product.reviewbackup_set.all()

ただし、これはビジネス全体のために少し混乱し_setます。ここで出番です。フィールドを次のようrelated nameに定義すると、次のようになります。product

product = models.ForeignKey(Productbackup, related_name='reviews')

次に、もう少し読みやすい方法で同じことを行うことができます(そしてPythonは読みやすいはずです...):

reviews = product.reviews.all()

ユーザーのプロフィール

外部キーを使用すると、1 対多の関係を実装できます。したがって、製品とレビューにとって、それは完全に理にかなっています. 1 つの製品に多数のレビューが含まれる場合があります。ただし、通常、ユーザー プロファイルには当てはまりません。通常、ユーザーには 1 つのユーザー プロファイルしかありません。したがって、ユーザープロファイル内では、ユーザーにする必要はありませんがForeignKey、代わりに次のOneToOneFieldように使用する必要があります。

user = models.OneToOneField(User, primary_key=True, related_name='profile')

これにより、ユーザーのプロファイルに簡単にアクセスできます。

user_profile = User.objects.get(...).profile

ユーザーのイメージ

レビューごとに、ユーザーはForeignKey私の最初の説明に従っているため、ユーザーの画像に非常に簡単にアクセスできます。

review = Reviewbackup.objects.all()[0]
user_image = review.user.profile.image   # <- see, very easy

画像の URL

Django で使用するときはいつでも、プロジェクト設定で定義されているメディア フォルダーの下FileFieldにファイルをアップロードします。あなたの場合、Djangoはメディアフォルダー内のフォルダーに画像を保存します。さらに、 を構成すると、次のようなファイルの URL にアクセスできます。upload_toMEDIA_ROOTimagesMEDIA_URL

user_profile.image.url

ハードコーディングされた URL

テンプレート内に直接の URL を含めるのは非常に悪い考えです。それがURLパターン名の目的です。したがって、後で名前を参照して URL を取得できるように、URL パターンに名前を割り当てるという考え方です。これにより、コードの保守性が大幅に向上します。たとえば、次はユーザーの url-pattern です。

url(r'^user/(?P<username>\w+)/$', 'user_view', name='user_view')

これにより、テンプレートで次のように使用できます。

{% load url from future %}
link: <a href="{% url 'user_view' username=user.username %}">{{ user.username }}</a>

すべてをまとめる

# views.py
def view_reviews(request, product_name):
    product = get_object_or_404(Productbackup, url_friendly=product_name)
    reviews = product.reviews.all().order_by("-created_on")
    return render_to_response('reserve/templates/view_reviews.html',
                              {'reviews':reviews},
                              context_instance=RequestContext(request))

# models.py
class Reviewbackup(models.Model):
    review = models.CharField('Review', max_length = 2000)
    user = models.ForeignKey(User, related_name='reviews')
    rating = models.IntegerField(max_length=2, choices=RATING_OPTIONS)
    product = models.ForeignKey(Productbackup, related_name='reviews')
    def __unicode__(self):
        return self.review

class UserProfile(models.Model):
    user = models.OneToOneField(User, primary_key=True, related_name='profile')
    image = models.ImageField(blank=True, null=True, max_length=255, upload_to="images/")

{# template #}
{% load url from future %}
{% for review in reviews %} 
    <br><a href="{% url user_view username=review.user.username %}">
        {{ review.user.username }}</a><br>
    <img class="thumbnail" src="{{ review.user.profile.image.url }}"><br>
    {{ review.review }}
{% endfor %}
于 2012-09-26T03:24:36.207 に答える
0

ユーザー プロファイルの取得方法がわからないようです。UserProfile が機能するように定義する方法に関する情報を次に示します。

https://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users

つまり、UserProfile.user を OneToOneField にすると、user.get_profile() を使用できるようになります。それ以外の場合は、モデル定義をそのままにして、UserProfile.objects.get(user=user)またはuser.userprofile_set.all()[0](eww) などを使用できます。

UserProfile オブジェクトを取得したら、@Ignacio はまったく正しいです。画像はそちらにあります。問題{{ review.user.userprofile.image }}は、ユーザーが OneToOneField ではなく ForeignKey であるため、代わりにユーザーがuserprofile_set属性を持っていることだと思います。

于 2012-09-26T00:10:05.090 に答える
-1

imageオンではありませんUser、オンUserProfileです。

{{ review.user.userprofile.image }}
于 2012-09-25T22:50:01.777 に答える