Django:将文件添加到表单中会引发多个参数错误 [英] Django: Adding files to a form gives multiple argument error

查看:90
本文介绍了Django:将文件添加到表单中会引发多个参数错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Django项目工作得很好。现在我需要添加一个字段来上传文件。
添加文件后,Django给出错误。即使在整天Googling之后也无法解决。



Models.py

  class salesman(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
company = models.ForeignKey(Organization,related_name ='salesmancomp')
salesman_name = models.CharField(max_length = 250)
salesman_address = models.CharField(max_length = 750,null = True,blank = True)
salesman_PAN = models.CharField(max_length = 250,null = true,blank = True)
salesman_commission_rate = models.FloatField(null = True,blank = True)
attachment = models.FileField(null = True,blank = True)

class Meta:
unique_together =(('company','salesman_name'),)

def __str __(self):
return self.salesman_name

forms.py

 $ code> class salesmanform(forms.ModelForm):
def __init __(self,user,* args,** kwargs):
self。 request = kwargs.pop('request',None)
super(salesmanform,self).__ init __(* args,** kwargs)

class Meta:
model = salesman
fields =('salesman_name','salesman_PAN','salesman_commission_rate','salesman_address','attachment')
widgets = {
'salesman_address':forms.Textarea

def clean(self):
clean_data = self.cleaned_data
salesman_name = clean_data ['salesman_name']
pk = self.instance.pk
insert = pk ==无
如果插入:
try:
salesman.objects.get(salesman_name = salesman_name,company = self.request.user.company.entity)
,除了salesman.DoesNotExist :
pass
else:
raise forms.ValidationError(Salesman already exists。)
else:
pass
return clean_dat a

Views.py

  @login_required 
def salesmancreate(request):

action =Salesman Creation
if request.method == 'POST':
rec_form = salesmanform(request.FILES,request = request,user = request.user,data = request.POST)
如果rec_form.is_valid():
new_rec = rec_form .save(commit = False)
new_rec.user = request.user
new_rec.company = request.user.company.entity
new_rec.save()
return HttpResponseRedirect(reverse ('salesmancreate'),{'section':'added'},messages.add_message(request,messages.SUCCESS,'Salesman added succesfully'))
else:
rec_form = salesmanform(request = request ,user = request.user)
receiptablescreated = salesman.objects.filter(company = request.user.company.entity).order_by(' - id')
retu (请求,'account / salesman.html',{'rec_form':rec_form,'应收款处理':应收账款,'action':action})

我的模板

 < form action = 方法= POST > 

< div class =form-group>

{{rec_form.salesman_name | attr:class:form-control| attr:placeholder:Salesman Name}}
< / div>

< div class =input-group margin-b-20>

{{rec_form.salesman_commission_rate | attr:class:form-control| attr:placeholder:Commission Perentage}}
< span class =input-group-addon < i class =fa fa-envelope-o fa-percent>< / i>< / span>
< / div>
< div class =form-group>

{{rec_form.salesman_PAN | attr:class:form-control| attr:placeholder:PAN of Salesman}}
< / div>
< div class =form-group>

{{rec_form.salesman_address | attr:class:form-control| attr:style:height:83px;| attr:placeholder:Address of Salesman}}
< / DIV>
< div class =form-group>

{{rec_form.attachment | attr:class:form-control| attr:style:height:83px;| attr:placeholder:Address of Salesman}}
< / DIV>


< div class =form-group clearfix>
< div class =pull-right>
{%csrf_token%}
< button type =submitclass =btn btn-success rounded> Save< / button>
< / div>
< / div>
< / form>

错误日志



$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
$ b $ _
请求URL:http://127.0.0.1:8000/salesmancreate/
Django版本:1.10
异常类型:TypeError
异常值:

__init __()获取关键字参数'user'的多个值

异常位置:/Users/pulkitsharma/Documents/workspace/tiktant/invoice/views.py在salesmancreate,第422行
Python可执行文件:/ usr / bin / python
Python版本:2.7.10
Python路径:

['/ Users / pulkitsharma / Documents / workspace / tiktant',
'/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip ',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
'/ System / L ibrary / Frameworks / Python.framework / Versions / 2.7 / lib / python2.7 / plat-darwin',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat -mac',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
'/系统/库/框架/Python.framework/Versions/2.7/Extras/lib/python',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/ python2.7 / lib-dynload',
'/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
'/Library/Python/2.7/ site-packages']

服务器时间:星期四,2016年6月3日06:45:34 +0000

环境:


请求方法:POST
请求URL:http://127.0.0.1:8000/salesmancreate/

Django版本:1.10
Python版本:2.7.10
安装的应用程序:
('invoice',
'django.contrib.admin',
'django.contrib.auth'
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'widget_tweaks')
安装的中间件:
('django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django .middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages .middleageMes​​sageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware')



追溯:

文件/Library/Python/2.7/site-packages/django/core/handlers/exception.py在i nner
39. response = get_response(request)

文件_Library/Python/2.7/site-packages/django/core/handlers/base.py在_legacy_get_response
249. response = self._get_response(request)

文件/Library/Python/2.7/site-packages/django/core/handlers/base.py在_get_response
187.响应= self.process_exception_by_middleware(e,request)

文件/Library/Python/2.7/site-packages/django/core/handlers/base.py在_get_response
185. response = wrapped_callback(request,* callback_args,** callback_kwargs)

文件/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py在_wrapped_view
23中。 return view_func(request,* args,** kwargs)

在salesmancreate中的文件/Users/pulkitsharma/Documents/workspace/tiktant/invoice/views.py
422. rec_form = salesmanform (request.FILES,请求= R equest,user = request.user,data = request.POST)

异常类型:TypeError at / salesmancreate /
异常值:__init __()获取关键字参数'user'的多个值


解决方案

您覆盖 __ init __ 方法,以便第一个参数是用户,但是您通过 request.FILES 。更改行:

  rec_form = salesmanform(request.FILES,request = request,user = request.user,data = request。 POST)

  rec_form = salesmanform(user = request.user,data = request.POST,
files = request.FILES,request = request)

作为经验法则,尽量不要混合命名和位置参数,特别是当您更改类构造函数签名时。还要考虑将您的表单名称更改为 SalesmanForm 以更符合 PEP-8 类命名约定。


Hi I have a Django project working perfectly fine. Now I need to add a field to it to upload documents. However after adding the file stuffs, Django gives errors. Unable to solve it even after whole day Googling.

Models.py

class salesman(models.Model):
    user=models.ForeignKey(settings.AUTH_USER_MODEL)
    company=models.ForeignKey(Organisation,related_name='salesmancomp')
    salesman_name=models.CharField(max_length=250)
    salesman_address=models.CharField(max_length=750,null=True,blank=True)
    salesman_PAN=models.CharField(max_length=250,null=True,blank=True)
    salesman_commission_rate=models.FloatField(null=True,blank=True)
    attachment = models.FileField(null=True,blank=True)

    class Meta:
        unique_together=(('company','salesman_name'),)

    def __str__(self):
        return self.salesman_name

forms.py

class salesmanform(forms.ModelForm): 
    def __init__(self,user, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(salesmanform, self).__init__(*args, **kwargs)

    class Meta:
        model=salesman
        fields=('salesman_name','salesman_PAN','salesman_commission_rate','salesman_address','attachment',)
        widgets = {
            'salesman_address': forms.Textarea
        }  
    def clean(self):
        cleaned_data=self.cleaned_data
        salesman_name=cleaned_data['salesman_name']
        pk=self.instance.pk
        insert = pk ==None
        if insert:
            try:
                salesman.objects.get(salesman_name=salesman_name,company=self.request.user.company.entity)
            except salesman.DoesNotExist:
                pass
            else:
                raise forms.ValidationError("Salesman already exist.")  
        else:
            pass       
        return cleaned_data 

Views.py

@login_required
def salesmancreate(request):

        action="Salesman Creation"
        if request.method == 'POST':
            rec_form=salesmanform(request.FILES,request=request,user=request.user,data=request.POST)
            if rec_form.is_valid():
                new_rec = rec_form.save(commit=False)
                new_rec.user = request.user
                new_rec.company=request.user.company.entity
                new_rec.save()
                return HttpResponseRedirect(reverse('salesmancreate'),{'section':'added'},messages.add_message(request, messages.SUCCESS,'Salesman added Succesfully'))
        else:
            rec_form=salesmanform(request=request,user=request.user)
        receivablescreated=salesman.objects.filter(company=request.user.company.entity).order_by('-id')
        return render(request,'account/salesman.html',{'rec_form':rec_form,'receivablescreated':receivablescreated,'action':action})

My Template

<form action="." method="post">

    <div class="form-group">

        {{ rec_form.salesman_name|attr:"class:form-control"|attr:"placeholder:Salesman Name"}}
    </div>

        <div class="input-group margin-b-20">

        {{ rec_form.salesman_commission_rate|attr:"class:form-control"|attr:"placeholder:Commission Perentage" }}
        <span class="input-group-addon"><i class="fa fa-envelope-o fa-percent"></i></span>
    </div>
        <div class="form-group">

        {{ rec_form.salesman_PAN|attr:"class:form-control"|attr:"placeholder:PAN of Salesman" }}
    </div>
    <div class="form-group">

        {{ rec_form.salesman_address|attr:"class:form-control"|attr:"style:height: 83px;"|attr:"placeholder:Address of Salesman" }}
    </div>
    <div class="form-group">

        {{ rec_form.attachment|attr:"class:form-control"|attr:"style:height: 83px;"|attr:"placeholder:Address of Salesman" }}
    </div>


    <div class="form-group clearfix">                                               
        <div class="pull-right">
        {% csrf_token %}
            <button type="submit" class="btn btn-success rounded">Save</button>
        </div>
    </div>
</form>                                    

Error Logs:

TypeError at /salesmancreate/

__init__() got multiple values for keyword argument 'user'

Request Method:     POST
Request URL:    http://127.0.0.1:8000/salesmancreate/
Django Version:     1.10
Exception Type:     TypeError
Exception Value:    

__init__() got multiple values for keyword argument 'user'

Exception Location:     /Users/pulkitsharma/Documents/workspace/tiktant/invoice/views.py in salesmancreate, line 422
Python Executable:  /usr/bin/python
Python Version:     2.7.10
Python Path:    

['/Users/pulkitsharma/Documents/workspace/tiktant',
 '/Library/Python/2.7/site-packages/pip-8.1.2-py2.7.egg',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Library/Python/2.7/site-packages']

Server time:    Thu, 3 Nov 2016 06:45:34 +0000

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/salesmancreate/

Django Version: 1.10
Python Version: 2.7.10
Installed Applications:
('invoice',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'widget_tweaks')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')



    Traceback:

    File "/Library/Python/2.7/site-packages/django/core/handlers/exception.py" in inner
      39.             response = get_response(request)

    File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _legacy_get_response
      249.             response = self._get_response(request)

    File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _get_response
      187.                 response = self.process_exception_by_middleware(e, request)

    File "/Library/Python/2.7/site-packages/django/core/handlers/base.py" in _get_response
      185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

    File "/Library/Python/2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
      23.                 return view_func(request, *args, **kwargs)

    File "/Users/pulkitsharma/Documents/workspace/tiktant/invoice/views.py" in salesmancreate
      422.             rec_form=salesmanform(request.FILES,request=request,user=request.user,data=request.POST)

    Exception Type: TypeError at /salesmancreate/
    Exception Value: __init__() got multiple values for keyword argument 'user'

解决方案

You override the __init__ method so that the first argument is user but you pass request.FILES instead. Change the line:

rec_form=salesmanform(request.FILES,request=request,user=request.user,data=request.POST)

to

rec_form = salesmanform(user=request.user, data=request.POST,
                        files=request.FILES, request=request)

As a rule of thumb, try not to mix named and positional arguments, especially when you change the class constructor signature. Also consider changing your form name to SalesmanForm to be more compliant with PEP-8 class naming conventions.

这篇关于Django:将文件添加到表单中会引发多个参数错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆