0

だから、私はユーザーページを作成しようとしています.そのURLはそのユーザー名に関連付けられます.

http://domain.com/accounts/profile/robin/

そのページでは、そのユーザー (ここでは「ロビン」) がアップロードしたすべての写真をテンプレートに表示したいと考えています。もう 1 つのことは、メニュー バーに request.user のプロファイル ページへのリンクがあることです。つまり、ログインしているユーザーです。ユーザーが「kevin」であると仮定すると、request.user の URL にもリダイレクトされます。お気に入り:

http://domain.com/accounts/profile/kevin/

どういうわけか、私は目的の出力を得ることができました。しかし、私が望んでいたのは、URLをrequest.userの名前以外に変更しても、request.userと他のユーザー名を簡単に区別して、テンプレートで操作できるようにすることでした。そして、うまくいけば、この解決策にたどり着きました。

しかし、これが適切な解決策であるかどうかは本当にわかりません。ユーザー名を request.user 以外に変更して、そのすべての情報を考え出すとどうなるでしょうか。それを行うより良い方法はありますか?

test.html:

<body>

        <div>
            <ul>
                <li><a href="/photo/">Photos</a></li>
                <li><a href="/accounts/profile/{{user_1}}/">{{user_1.username}}</a></li>
            </ul>   
        </div>

        <div id="wrapper">
            {% block content %}
            {% endblock %}
        </div>
    </body>

profile_page.html:

{% extends 'test.html' %}

{% block content %}
<p>{{user.username}}</p>

<div id="container">
{% for photo in photos %}
<img src="{{MEDIA_URL}}{{photo.image}}" width="300px" />
{% endfor %}
</div>

{% endblock %}

models.py:

 class Photo(models.Model):
    title = models.CharField(max_length=200)
    image = models.ImageField(upload_to=get_upload_file_name, blank=True)
    pub_date = models.DateTimeField(default=datetime.now)
    creator = models.ForeignKey(User, related_name="creator_set")
    likes = models.ManyToManyField(User, through="Like")

    class Meta:
        ordering = ['-pub_date']
        verbose_name_plural = ('Photos')

     def __unicode__(self):
        return self.title

アプリの urls.py:

    url(r'^profile/(?P<username>\w+)/$', 'userprofile.views.profile_page'),

ビュー.py:

@login_required
def profile_page(request, username):
    if request.user.is_authenticated:
        user_1 = request.user
        user = User.objects.get(username=username)
        user_photos = user.creator_set.all()
        return render(request, 'profile_page.html', {'user':user,'photos':user_photos, 'user_1':user_1})
4

2 に答える 2

0

まず、Django テンプレートで直接使用できます。たとえば、次のrequest.userように設定する必要はありません。user_1

<li><a href="/accounts/profile/{{request.user}}/">{{request.user.username}}</a></li>

うまくいくでしょう。

次に、その URL を取得するための推奨される方法 (後で場所を変更した場合に問題が回避される) は、次のように urlpattern の名前を指定することです。

url(r'^profile/(?P<username>\w+)/$', 'userprofile.views.profile_page', name='profile'),

次にurl、テンプレートでタグを使用します。

<li><a href="{% url 'profile' username=request.user.username %}">{{request.user.username}}</a></li>

そして、後で urlpattern を変更した場合でも、常に正しい URL を取得します。

于 2013-10-31T02:39:44.463 に答える
0

request.userasと userを渡してuser_1プロファイルを表示する代わりに、user逆の方法で行います。テンプレートuserでは、ログインしているユーザーとリクエストを実行するための変数を既に取得しています。

ビューを次のように更新します。

@login_required
def profile_page(request, username):
    if request.user.is_authenticated:
        #no need for user, photos
        user_1 = User.objects.get(username=username)
        return render(request, 'profile_page.html', {'user_1':user_1})

また、写真のリストを渡す必要はありません。テンプレート自体で行うことができます。したがって、テンプレートを次のように更新します。

{% extends 'test.html' %}

{% block content %}
<p>{{user_1.username}}</p>

<div id="container">
    {% for photo in user_1.creater_set.all %}
        <img src="{{MEDIA_URL}}{{photo.image}}" width="300px" />
    {% endfor %}
</div>

{% endblock %}

test.html のブロックを次のように変更します。

<ul>
    <li><a href="/photo/">Photos</a></li>
    {#here you can use name of the pattern as well instead of view #}
    <li><a href="{% url 'userprofile.views.profile_page' user.username%}">             
             {{user.username}} </a></li>
</ul>   
于 2013-10-31T04:59:52.037 に答える