Django устанавливает начальное значение предварительно заполненного поля

У меня есть две модели:

class Budget(models.Model):
    name = models.CharField(max_length=25)
    quantity = models.DecimalField(max_digits=10, decimal_places=2)
    date = models.DateField(default=now)
    datecompleted = models.DateTimeField(blank=True, null=True)

    class Meta:
        ordering = ['-date']

    def __str__(self):
        return self.name

class Expenses(models.Model):
    name = models.CharField(max_length=25)
    quantity = models.DecimalField(max_digits=10, decimal_places=2)
    budget = models.ForeignKey(Budget, on_delete=models.CASCADE,
                               related_name='budget_expense')
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    date = models.DateField(default=now)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ['-date']

и моя форма выглядит следующим образом

class ExpenseForm(forms.ModelForm):
    date = forms.DateTimeField(
        widget=forms.widgets.DateTimeInput(attrs={'class': 'form-control', 'type': 'datetime-local'}),
        label='Data', input_formats=['%d/%m/%Y %H:%M'])

    class Meta:
        model = Expenses
        fields = ('name', 'quantity', 'budget', 'category', 'date')

и теперь я пытаюсь создать экземпляр Expense с предварительно заполненным (существующим) экземпляром Budget с помощью следующего кода:

def expense_add(request, pk):
    if request.method == 'GET':
        budget = get_object_or_404(Budget, pk=pk)
        form = ExpenseForm(initial={'budget': budget.name})
        return render(request, 'budget/expense-create.html', {'form': form})
    else:
        form = ExpenseForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('list')
        return render(request, 'budget/expense-create.html', {'form': form})

но, как вы можете догадаться, в бюджетном поле внутри моего поля формы ничего нет. enter image description here Пожалуйста, помогите. Спасибо всем!

Проблема в файле views.py, где вы устанавливаете начальное значение бюджета. Он ожидает либо объект budget, либо id объекта budget, но вы даете имя объекта. Поэтому вы можете исправить это, удалив .name из 4-й строки.

Исправленное мнение:

def expense_add(request, pk):
    if request.method == 'GET':
        budget = get_object_or_404(Budget, pk=pk)
        form = ExpenseForm(initial={'budget': budget})
        return render(request, 'budget/expense-create.html', {'form': form})
    else:
        form = ExpenseForm(request.POST or None)
        if form.is_valid():
            form.save()
            return redirect('list')
        return render(request, 'budget/expense-create.html', {'form': form})

Спасибо всем! В моем шаблоне url был еще один path('budget/<int:pk>/expense-create', ExpenseCreateView.as_view(), name='expense-create'),, который закрывал или перезаписывал мой вид или что-то еще, я полагаю... как только я закомментировал его def expense_add - заработало!!!

Вернуться на верх