11

私はこれで何時間も輪になって回っています。profile_picImageField
を持つUserProfileモデルがあります。ユーザーの写真を保存して表示したいのですが、何も機能しません。私はドキュメント、SO、グーグルを調べましたが、結果はありませんでした。 写真をアップロードしましたが、URLがデータベースに保存されていることがわかります。これは私が持っているものです:

# models.py
    class UserProfile(models.Model):
        ...
        title       = models.CharField()
        about_me    = models.CharField()
        profile_pic = models.ImageField(upload_to=content_file_name, blank=True)

# views.py
    def user_details(request):
        if request.method == 'POST':
            form = UserProfileForm(request.POST, request.FILES, instance=request.user.get_profile())
            if form.is_valid():
                form.save()
                return HttpResponseRedirect('/')
        else:
            form = UserProfileForm(instance=request.user.get_profile())
        return render_to_response('user_details.html',
                {'user': request.user, 'form': form},
                context_instance=RequestContext(request))

# user_details.html
    {% for field in form %}
      {% if field.name != "profile_pic" %}
        <!-- display regular fields -->
        {{ field.label_tag }}{{ field }}
      {% else %}
        <!-- display the user photo -->
        <img src="{{ MEDIA_URL }}{{ field.url }}" />
      {% endif %}
    {% endfor %}

レンダリングされたHTMLのソースを表示すると、表示されるのはMEDIA_URL(つまり、「media /」)だけですが、写真のURLは表示されません。{{field.url}}を{{field}}に置き換えると、「Currently」というラベル、「Clear」チェックボックス、画像を変更するオプションが付いたURLが表示されます。しかし、画像自体は見えません。
誰かが私が間違っていることを提案できますか?

4

2 に答える 2

21

申し訳ありませんが、のコンテキストに十分な注意を払っていませんでしたfield。forループから取得する「フィールド」は、フォームを作成する目的でフィールドに関する他のデータを含む特殊なラッパーです。これはモデル自体のフィールドではなく、フォームの目的のための単なる表現です。

の現在の値を取得するprofile_picには、フォームのインスタンスを使用する必要があります。

<img src="{{ form.instance.profile_pic.url }}" />

{{ MEDIA_URL }}url属性を使用する場合は、自動的に追加されるため、不要MEDIA_URLです。

于 2012-03-22T20:54:45.817 に答える
8

これは私のために働きます:

    {% for field in form %}
    <p>
        {{ field.errors }}
        {{ field.label_tag }}
        {% if field.field|get_type == "django.forms.fields.ImageField" and field.value %}
            <br/><img src="{{ field.value.url }}" width="240"></img></br>
        {% endif %}
        {{ field }}
    </p>
    {% endfor %}

get_typeは、次のように定義されたテンプレートタグです。

from django import template

register = template.Library()

@register.filter
def get_type(value):
    t = type(value)
    return t.__module__ + "." + t.__name__
于 2014-08-20T19:32:49.623 に答える