2016-04-20 36 views
0

我正在嘗試使用內嵌表單製作表單,主窗體具有可編輯字段。一個選擇字段需要獲取僅登錄用戶的數據。Django Views未傳遞與登錄用戶相關的值,但傳遞了所有用戶的數據

views.py

@login_required 
def createinvoice(request): 
    new_formset=createinvoiceformset(instance=serviceinvoice()) 
    if request.method == 'POST': 
     inv_form=createinvoiceform(data=request.POST)   
     if inv_form.is_valid(): 
      new_form=inv_form.save(commit=False) 
      new_form.user=request.user 
      new_formset=createinvoiceformset(request.POST,instance=new_form) 
      if new_formset.is_valid(): 
       new_form.save() 
       hero=new_formset.save(commit=False) 
       for hero1 in hero: 
        hero1.user=request.user 
        hero1.save() 
       return HttpResponse('Invoice created') 
    else: 
     inv_form=createinvoiceform()   
     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}) 

要與鏈接到登錄的用戶數據填充選擇字段。我用

inv_form.fields["invoice_receivable"].queryset=Receivables.objects.filter(user=request.user) 

這行代碼做給掛登錄用戶只能數據,但如果形式給出了一些錯誤,選場得到所有登錄的用戶的數據。

回答

2

您正在設置else塊中的查詢集,因此它只發生在GET請求中。

您還需要爲POST請求設置查詢集。

if request.method == 'POST': 
    inv_form=createinvoiceform(data=request.POST) 
    inv_form.fields["invoice_receivable"].queryset=Receivables.objects.filter(user=request.user) 

這樣做的一個問題是您有重複的代碼。一個更好的辦法是重寫窗體的__init__方法接受user作爲參數,並設置在那裏的查詢集:

class CreateInvoiceForm(forms.ModelForm): 
    ... 

    def __init__(self, *args, **kwargs): 
     user = kwargs.pop('user') 
     super(CreateInvoiceForm, self).__init__(*args, **kwargs) 
     self.fields["invoice_receivable"].queryset = Receivables.objects.filter(user=user) 

請注意,我已經改名爲形式CreateInvoiceForm,這是Python類推薦款式。

然後,您需要到user傳遞給窗體作爲關鍵字參數,只要你初始化它,例如

inv_form = CreateInvoiceForm(data=request.POST, user=request.user) 
+0

請給__init__方法的一個例子。學習django hardway,感謝像你這樣的人,隨時準備提供幫助。 –

+1

我已經添加了一個例子 – Alasdair

相關問題