2017-09-19 4 views
0

Ich versuche Fileuploads in Django - Ich habe Probleme mit dem Speichern eines Formulars mit einem Dateifeld darin. Ich habe ähnliche Ansichten, die absolut gut funktionieren, ich verstehe nicht, warum hier ein Fehler gemacht wird.Upload Pfad Argument Fehler auf form.save()

from django.conf import settings 
from django.core.files.storage import FileSystemStorage 

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

Da ist in meinem models.py

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

Hier ist die Zurückverfolgungs

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) 

Kann jemand diesen Fehler zu mir erklären? Dank

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

Können Sie Ihr 'forms.py' anzeigen? – zaidfazil

+0

hast du zu einer anderen Version von Django gewechselt? –

+0

Ich bin mir nicht sicher, was Sie mit dieser Instance "FileSystemStorage" versuchen, aber es wird nicht von Ihrem Formular verwendet und das ist nicht so, wie Sie es sowieso verwenden. Wie der Traceback zeigt, wird der Fehler verursacht, wenn Ihr Modell selbst versucht, die 'upload_path'-Funktion aufzurufen, da sie im 'upload_to'-Attribut des Dateifeldes verwendet wird. –

Antwort

3

Ihre upload_path Funktion 2 Argumente akzeptieren müssen instance und filename, aber Sie haben eine benutzerdefinierte Funktion definiert, die benötigt 3 Argumente, die Strings sind. Sie sollten Ihre upload_path Funktion vielleicht eher wie dies ändern,

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

upload_path Funktion oder eine in upload_to Option übergeben Funktion in einem FileField aufgerufen wird, wenn das Modell gespeichert wird, mit bestimmten Argumenten wie oben beschrieben.

+0

Danke für die Erklärung! –

Verwandte Themen