Как передать текущего зарегистрированного пользователя при отправке формы в django? - PullRequest
0 голосов
/ 05 июля 2019

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

Данные не передаются в базу данных и выдают ошибку, такую ​​как - Просмотр инвесторов.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 одновременно.

Ответы [ 4 ]

2 голосов
/ 05 июля 2019

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

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

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

0 голосов
/ 05 июля 2019

Другая ошибка: метод __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 голосов
/ 05 июля 2019

Вам необходимо заменить saving.investor = request.user.id на saving.investor.user = request.user.

0 голосов
/ 05 июля 2019

Сначала выведите investment_form ошибок, если форма недействительна.

 if investment_form.is_valid():
        ................
 else:
    return HttpResponse(investment_form.errors)

Попробуйте это:

saving.investor.user = request.user
...