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})
но, как вы можете догадаться, в бюджетном поле внутри моего поля формы ничего нет.
Пожалуйста, помогите. Спасибо всем!
Проблема в файле 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 - заработало!!!