1

ユーザーがサイトに写真をアップロードできるようにする ImageField フォームを備えた django テンプレートがあります。

1) フォームに {% csfr_token %} が含まれている 2) レンダリング変数を使用してテンプレートをレンダリングします。

また、テンプレートのフォームに enctype="multipart/form-data" を設定しましたか?

それでも私はCSFRベリフを取得します。不合格。誰でも助けることができますか?

template.html からのコード

<form enctype="multipart/form-data" action='{% url photo username %}' method="post">
            {% csrf_token %}
              <p>{{ form.non_field_errors }}</p>
              <p>{{ form.profile_picture.label_tag }} {{ form.profile_picture.help_text }}</p>
              <p>
              {{ form.profile_picture.errors }}
              {{ form.profile_picture }}
              </p>
              <p><input type="submit" value="Upload" /></p>
            </form>   

景色:

def upload_photo(request, nick):
#c = {}
#c.update(csrf(request))
if request.method == 'POST':
    form = PictureForm(request.POST, request.FILES)
    if form.is_valid():
        newpic = Picture(profile_picture = request.FILES['profile_picture'])
        newpic.save()

        # Redirect to the document list after POST
        return HttpResponseRedirect(reverse('profiles.views.upload_photo', args=[nick]))
else:
    form = PictureForm() # A empty, unbound form

# Load documents for the list page
pictures = Picture.objects.all()

# Render list page with the documents and the form
return render_to_response(
    'profile.html',
             #various render variables here
             })

更新:トレースバック

Environment:


Request Method: POST
Request URL: localhost/hello/john/

Django Version: 1.4.2
Python Version: 2.7.2
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'django.contrib.admindocs',
 'friendship',
 'search',
 'tour',
 'profiles')
Installed Middleware:
('django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/mike/Documents/ics/django/ics/profiles/views.py" in upload_photo
  18.           newpic.save()
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" in save
  463.         self.save_base(using=using, force_insert=force_insert, force_update=force_update)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py" in save_base
  551.                 result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py" in _insert
  203.         return insert_query(self.model, objs, fields, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py" in insert_query
  1593.     return query.get_compiler(using=using).execute_sql(return_id)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py" in execute_sql
  909.         for sql, params in self.as_sql():
File "/usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.py" in as_sql
  872.                 for obj in self.query.objs
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py" in pre_save
  249.             file.save(file.name, file, save=False)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/files.py" in save
  85.         name = self.field.generate_filename(self.instance, name)
File "/home/mike/Documents/ics/django/ics/profiles/models.py" in get_image_name
  8.    name =  str(instance.user_id) + ".jpg"
File "/usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.py" in __get__
  343.                 raise self.field.rel.to.DoesNotExist

エラーがここにあることがわかりました(models.py):

def get_image_name(instance, filename):
    return  str(instance.user_id) + ".jpg"
    #str(____) + ".jpg" causes the exception

class Picture(models.Model):
    user_id = models.ForeignKey(User)
    profile_picture = models.ImageField(storage=OverwriteStorage(), upload_to=get_image_name)

なぜこれが起こるのか考えていますか?

私がやろうとしているのは、ユーザーがユーザー名でアップロードした画像を保存することです。しかし、models.py 内でユーザーのユーザー名を取得するにはどうすればよいですか?

4

1 に答える 1

1

csrf トークンを使用してコンテキストを手動で更新していないため、render to response メソッドで RequestContext を使用する必要があります。

return render_to_response('profile.html', { 
   ..your data dict.. }, context_instance=RequestContext(request))

https://docs.djangoproject.com/en/1.2/ref/templates/api/#subclassing-context-requestcontextも参照してください(まだ関数スタイルのビューを使用しているため、django の古いバージョンにリンクしています)

編集:

csrf の問題が修正されたので、別の新しいエラーに対処しています。Picture モデルで「user_id」を「user」に (一貫性を保つために) 変更str(instance.user.username)し、get_image_name で使用してみてください。これが機能しない場合でも (通常は機能するはずです)、元のリクエストには回答済みなので、新しい質問を投稿してください。人々は csrf を検索してここにたどり着き、無関係な問題を読んでいる可能性があります。

于 2012-12-27T03:36:20.603 に答える