簡體   English   中英

在 Django 中提交表單時如何傳遞當前登錄用戶?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM