2016-04-19 29 views
0

私はinlinefactoryを使用して2つのモデルでビューを構築しようとしています。これは、レンダリングさModels.pyDjango inlineformset_factoryレンダリングエラー

class serviceinvoice(models.Model): 
    user=models.ForeignKey(User,related_name='invoice')  
    invoice_number=models.PositiveIntegerField() 
    #invoice_no = models.CharField(max_length = 500, default = increment_invoice_number, null = True, blank = True) 
    invoice_date = models.DateField() 
    invoice_receivable=models.ForeignKey(Receivables,null=True) 
    total_amount=models.DecimalField(decimal_places=2,max_digits=20) 
    total_amountwithtax=models.DecimalField(decimal_places=2,max_digits=20) 

    def __str__(self): 
     return self.invoice_number 

class serviceinvoiceitems(models.Model): 
    user=models.ForeignKey(settings.AUTH_USER_MODEL,related_name='serviceinvoiceitems') 
    invoice_number=models.ForeignKey(serviceinvoice) 
    Product=models.CharField(max_length=1000,null=True) 
    UOM=models.CharField(max_length=100,null=True) 
    Quantity=models.FloatField(null=True) 
    Rate=models.FloatField(null=True) 
    Tax_rate=models.FloatField(null=True) 

    def __str__(self): 
     return self.invoice_number 

forms.py

createinvoiceformset = inlineformset_factory(serviceinvoice, serviceinvoiceitems,fields='__all__') 

class createinvoice(forms.ModelForm): 
    class Meta: 
     model = serviceinvoice 
     exclude = ('user',) 
     widgets = { 
      'invoice_date': forms.DateInput(attrs={'class':'datepicker'}), 
     } 

views.py

@login_required 
def createinvoice(request): 
    if request.method == 'POST': 
     inv_form=createinvoice(data=request.POST)   
     if inv_form.is_valid(): 
      new_form=inv_form.save(commit=False) 
      new_formset=createinvoiceformset(request.POST,instance=new_form) 
      if new_formset.is_valid(): 
       new_form.save() 
       new_formset.save() 
       return HttpResponse('Invoice created') 
    else: 
     inv_form=createinvoice() 
     new_formset=createinvoiceformset(instance=serviceinvoice()) 
     inv_form.fields["invoice_receivable"].queryset=Receivables.objects.filter(user=request.user) 
    return render(request,'account/createinvoice.html',{'inv_form':inv_form,'new_formset':new_formset}) 

次のエラーがテンプレートにあります。

_wrapped_view(1つの)必要な位置引数不足している: '要求'

トレースバック

Environment: 


Request Method: GET 
Request URL: http://localhost:8000/invoice/createinvoice/ 

Django Version: 1.8.9 
Python Version: 3.4.0 
Installed Applications: 
('invoice', 
'django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles') 
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 "C:\Python34\lib\site-packages\django\core\handlers\base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "C:\Python34\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view 
    22.     return view_func(request, *args, **kwargs) 
File "D:\pythonspace\tiktant\invoice\views.py" in createinvoice 
    106.   inv_form=createinvoice(instance=request) 

Exception Type: TypeError at /invoice/createinvoice/ 
Exception Value: _wrapped_view() missing 1 required positional argument: 'request' 
+0

のためのキャメルケースのためにアンダースコアを使用した場合に質問を投稿する際に、完全なトレースバックを表示してくださいより明確になります。 – Alasdair

+0

@ Alasdairあなたの答えは不思議でしたが、フォーム提出時にエラーが発生しました "割り当て前にローカル変数 'new_formset'が参照されました" –

答えて

1

あなたのビュー名フォームcreateinvoicecreateinvoice衝突を。彼らは違うはずです。

あなたのコードは、関数名(例えばdef create_invoice(...))、およびクラス名(例えばclass CreateInvoice(...)CreateInvoiceFormSet、...)

+0

それは働いた。しかし、フォームを送信している間、私はエラー "ローカル変数 'new_formset'が割り当ての前に参照される"を取得します。任意の解決策をお願いします –

+1

問題は、リクエストメソッドが 'POST'でフォームが有効でないときに' new_formset'を定義していないことです。 'new_formset = createinvoiceformset(instance = serviceinvoice())'をビューの一番上に移動して修正することができます。 – Alasdair

+1

GETリクエストの 'invoice_receivable'クエリーセットだけを変更していることに注意してください。これは、ユーザーがPOST要求を改ざんし、別の 'invoice_receivable'を選択できる可能性があることを意味します。 – Alasdair

関連する問題