在Django中提交表单时如何传递当前登录的用户?

2024-09-30 06:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建一个表单,允许当前登录的用户提交数据。 表单由字段组成-金额、利率(利息)、时间戳(自动拾取)和当前登录的用户。你知道吗

数据没有传递到数据库中,并给出了一个错误,如-视图investors.views.InvestView没有返回HttpResponse对象。结果却一个也没有。你知道吗

你知道吗视图.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部分。你知道吗


Tags: 数据pyselfform表单returnmodelsrequest
3条回答

此问题与添加用户无关。这是因为在验证失败的情况下你什么都不做。你知道吗

你应该把你的函数反过来,以便渲染是在所有情况下命中。你知道吗

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__方法。你知道吗

您需要用saving.investor.user = request.user替换saving.investor = request.user.id。你知道吗

另一个错误:窗体的__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)

通过请求用户作为第一个论点,也应该有所帮助。你知道吗

相关问题 更多 >

    热门问题