![](/img/trans.png)
[英]Django How I can pass request.user(current logged user) in forms when I use class based view?
[英]How can I pass current logged in user while form submission in django?
我正在嘗試創建一個允許當前登錄用戶提交數據的表單。 表單包括字段 - 金額、利率(利息)、時間戳(自動提取)和當前登錄的用戶。
數據沒有傳遞到數據庫中,並給出一個錯誤,如 - 視圖 Investors.views.InvestView 沒有返回 HttpResponse 對象。 它返回 None 。
視圖.py
def InvestView(request):
if request.method == 'GET':
investment_form = InvestorsForm(request.user)
context = {'investment_form': investment_form}
return render(request, 'investors/form.html', context)
if request.method == 'POST':
investment_form = InvestorsForm(request.POST or None, instance=request.user)
if investment_form.is_valid():
amount = investment_form.cleaned_data['amount']
interest = investment_form.cleaned_data['rate']
saving = investment_form.save(commit=False)
# Passing Logged in user
investor = request.user
print(investor)
saving.investor = request.user.id
saving.save()
messages.success(request, f'New Investment Done!')
return redirect('/myinvest/')
表格.py
class InvestorsForm(forms.ModelForm):
class Meta :
model = Investment
fields = ['amount', 'rate']
def __init__(self, user, *args, **kwargs):
self.user = user
super(InvestorsForm, self).__init__(*args, **kwargs)
模型.py
class Investor(models.Model):
name = models.CharField(max_length=99)
user = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Investment(models.Model):
amount = models.FloatField(blank=False)
rate = models.FloatField(blank=False)
timestamp = models.DateField(default=datetime.now)
investor = models.ForeignKey(Investor, on_delete=models.CASCADE)
def __str__(self):
return str(self.investor)
數據必須存儲到數據庫中並同時將頁面重定向到 myinvest 部分。
此問題與添加用戶無關。 這是因為在驗證失敗的情況下您什么也不做。
您應該反方向旋轉函數,以便在所有情況下都可以渲染。
def InvestView(request):
if request.method == 'POST':
investment_form = InvestorsForm(request.POST)
if investment_form.is_valid():
saving = investment_form.save(commit=False)
saving.investor.user = request.user
saving.save()
messages.success(request, f'New Investment Done!')
return redirect('/myinvest/')
else:
investment_form = InvestorsForm()
context = {'investment_form': investment_form}
return render(request, 'investors/form.html', context)
注意縮進。
驗證的實際失敗是因為您已更改了表單的簽名,以便首先接受user
參數,而不是預期的data
。 但是,不清楚為什么要執行此操作,因為您不使用該值,而是在視圖中設置用戶。 您應該刪除該__init__
方法。
如果表單無效,則首先顯示investment_form
錯誤。
if investment_form.is_valid():
................
else:
return HttpResponse(investment_form.errors)
嘗試這個:
saving.investor.user = request.user
您需要將saving.investor = request.user.id
替換為saving.investor.user = request.user
。
另一個錯誤:表單的__init__
方法將user
作為其第一個參數:
def __init__(self, user, *args, **kwargs):
對於GET請求,您可以正確傳遞它:
investment_form = InvestorsForm(request.user)
但是隨后有了POST請求,您就忘記了:
investment_form = InvestorsForm(request.POST or None, instance=request.user)
將request.user作為第一個參數傳遞也應該有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.