2017-09-19 8 views
0

私はDjangoでファイルアップロードを試みています - ファイルフィールドを含むフォームを保存する際に問題があります。私はこれと似たような意見を持っていますが、これは絶対にうまくいきます。なぜこのエラーが発生したのか分かりません。form.save()のアップロードパス引数エラー

私のmodels.pyで次に
from django.conf import settings 
from django.core.files.storage import FileSystemStorage 

def view1(request): 
    ... 
    if form.is_valid(): 
     form.save() 
     ... 

def upload_path(var1, var2, var3): 
    return "{}/{}/{}/".format(var1, var2, var3) 

ここでトレースバックが

Internal Server Error: /app/view1/ 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\django\core\handlers\exception.py", line 41, in inner 
    response = get_response(request) 
    File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 249, in _legacy_get_response 
    response = self._get_response(request) 
    File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 187, in _get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "C:\Python27\lib\site-packages\django\core\handlers\base.py", line 185, in _get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "C:\Code\app\views.py", line 216, in view1 
    form.save() 
    File "C:\Python27\lib\site-packages\django\forms\models.py", line 463, in save 
    self.instance.save() 
    File "C:\Python27\lib\site-packages\django\db\models\base.py", line 807, in save 
    force_update=force_update, update_fields=update_fields) 
    File "C:\Python27\lib\site-packages\django\db\models\base.py", line 837, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "C:\Python27\lib\site-packages\django\db\models\base.py", line 923, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "C:\Python27\lib\site-packages\django\db\models\base.py", line 962, in _do_insert 
    using=using, raw=raw) 
    File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 85, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\django\db\models\query.py", line 1076, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py", line 1098, in execute_sql 
    for sql, params in self.as_sql(): 
    File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py", line 1051, in as_sql 
    for obj in self.query.objs 
    File "C:\Python27\lib\site-packages\django\db\models\sql\compiler.py", line 1000, in pre_save_val 
    return field.pre_save(obj, add=True) 
    File "C:\Python27\lib\site-packages\django\db\models\fields\files.py", line 296, in pre_save 
    file.save(file.name, file.file, save=False) 
    File "C:\Python27\lib\site-packages\django\db\models\fields\files.py", line 93, in save 
    name = self.field.generate_filename(self.instance, name) 
    File "C:\Python27\lib\site-packages\django\db\models\fields\files.py", line 327, in generate_filename 
    filename = self.upload_to(instance, filename) 
TypeError: upload_path() takes exactly 3 arguments (2 given) 

誰かが私にこのエラーを説明できますか? おかげで

EDIT

models.py

class Model1(models.Model): 
    certno = models.CharField(max_length = 20) 
    datecreated = models.DateTimeField(auto_now_add = True) 
    pdf = models.FileField(upload_to = upload_path("apple", "cherry", "grapefruit"), null = True, blank = True) 

    def __unicode__(self): 
     return str(self.certno) 

forms.py

class PatForm(forms.ModelForm): 

    class Meta: 
     model = Pat 
     exclude = ['datecreated'] 
     labels = { 
      'certno': _('Certificate Number'), 
      'pdf': _('PDF'), 
     } 
+0

あなたの 'forms.py'を表示できますか? – zaidfazil

+0

Djangoの別のバージョンに切り替えましたか? –

+0

私はあなたがその 'FileSystemStorage'インスタンシエーションで何をしようとしているのかよく分かりませんが、あなたのフォームでは使用されていません。トレースバックが示すように、モデル自体がファイルフィールドの 'upload_to'属性で使用されているため、' upload_path'関数を呼び出そうとしたときにエラーが発生しています。 –

答えて

3

あなたupload_path関数は2つの引数instancefilenameを受け入れる必要がありますが、そのカスタム関数を定義しています3つの引数をとります。これは文字列になります。モデルが保存されるたびに あなたは多分もっとこのようなあなたのupload_path機能を変更する必要があり、FileFieldupload_toオプションに渡さ

def upload_path(instance, filename): 
    return "{}/{}".format(instance.certno, filename) 

upload_path機能または任意の関数を上記のように説明した明確な引数を使って、呼ばれています。

+0

説明をありがとう! –