Я пытаюсь создать форму, которая позволяет текущему зарегистрированному пользователю отправлять данные. Форма состоит из поля - сумма, ставка (проценты), отметка времени (автоматически подбирается) и зарегистрированного пользователя.

Данные не передаются в базу данных и выдают ошибку вроде: - Представление investors.views.InvestView не возвращало объект HttpResponse. Вместо этого он вернул None.

Views.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/')

Forms.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)

Models.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 одновременно.

0
Manish 5 Июл 2019 в 10:33

3 ответа

Лучший ответ

Другая ошибка: метод __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 в качестве первого аргумента также должна помочь.

0
RemcoGerlich 5 Июл 2019 в 07:56

Эта проблема не имеет ничего общего с добавлением пользователя. Это потому, что вы ничего не делаете в случае сбоя проверки.

Вы должны повернуть свою функцию в обратном направлении, чтобы рендеринг попадал во всех случаях.

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__ метод.

2
Daniel Roseman 5 Июл 2019 в 07:53

Вам нужно заменить saving.investor = request.user.id на saving.investor.user = request.user.

0
cagrias 5 Июл 2019 в 07:45