長い回答で申し訳ありません。あなたのコードから判断すると、あなたは Django を初めて使うと思います。そのため、この回答が有益であり、プロセスの回答の質問でも役立つことを願っています。
ユーザー
レビュー モデルでは、ではなく にするuser
必要があります。特にデータベーステーブルを自分で見る場合は、ユーザー名を保存する方が自然に思えることは理解していますが、そのアプローチはエラーが発生しやすく、非常に正当な理由がない限り、悪いことです。ForeignKey
CharField
ユーザー名が のユーザーがいるとします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_to
MEDIA_ROOT
images
MEDIA_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 %}