0

我正在尝试创建一个允许当前登录用户提交数据的表单。该表单包括字段 - 金额、利率(利息)、时间戳(自动提取)和当前登录的用户。

数据未传递到数据库并给出错误,例如 - 视图 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 部分。

4

3 回答 3

2

此问题与添加用户无关。这是因为如果验证失败,您什么也不做。

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

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__方法。

于 2019-07-05T07:53:19.960 回答
0

您需要替换saving.investor = request.user.idsaving.investor.user = request.user.

于 2019-07-05T07:45:36.600 回答
0

另一个错误:您的表单__init__方法将 auser作为其第一个参数:

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 作为第一个参数传递也应该有所帮助。

于 2019-07-05T07:56:24.267 回答