Как сохранить данные из ModelForm в базу данных в django?
У меня есть модель:
class Cost(models.Model):
project = models.ForeignKey(Project)
cost = models.FloatField()
date = models.DateField()
Для модели я создал класс ModelForm
:
class CostForm(ModelForm):
class Meta:
model = Cost
fields = ['date', 'cost']
с view.py
:
def cost(request, offset):
if request.method == 'POST':
# NOTE: How to save the data in DB?
return HttpResponseRedirect('/')
else:
form = CostForm()
и следующий шаблон:
<form action="/cost/{{ project }}/" method="post" accept-charset="utf-8">
<label for="date">Date:</label><input type="text" name="date" value={{ current_date }} id="date" />
<label for="cost">Cost:</label><input type="text" name="cost" value="0" id="cost" />
<p><input type="submit" value="Add"></p>
</form>
Вопрос
Как я могу сохранить данные из формы в базу данных?
Дополнительная информация:
model.py
содержит
class Project(models.Model):
title = models.CharField(max_length=150)
url = models.URLField()
manager = models.ForeignKey(User)
timestamp = models.DateTimeField()
Моя попытка
Я попытался реализовать решение следующим образом (примечание: offset = имя проекта):
def cost(request, offset):
if request.method == 'POST':
form = CostForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.project = Project.objects.filter(title=offset)
instance.date = request.date
instance.cost = request.cost
instance.save()
return HttpResponseRedirect('/')
else:
form = CostForm()
Но это не работает: (
Ответы
Ответ 1
Я нашел решение. Переписал view.py
следующим образом:
def cost(request, offset):
if request.method == 'POST':
project = Project.objects.get(title=offset)
date = request.POST.get('date', '')
cost = request.POST.get('cost', '')
cost_obj = Cost(project=project, date=date, cost=cost)
cost_obj.save()
return HttpResponseRedirect('/')
Остальная часть кода не изменилась.
Ответ 2
Несколько вещей выглядят не так:
-
Project.objects.filter()
вернет запрос. Вместо этого используйте Project.objects.get()
... он вернет только один объект Project
-
Вам не нужно явно указывать стоимость и дату, которые будут обрабатываться с помощью instance=form.save(commit=False)
-
Вы не используете форму в своем шаблоне...
Попробуйте следующее:
Шаблон:
<form action="/cost/{{ project }}/" method="post" accept-charset="utf-8">
{{form.as_p}}
<p><input type="submit" value="Add"></p>
</form>
Вид:
def cost(request, offset):
if request.method == 'POST':
form = CostForm(request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.project = Project.objects.get(title=offset)
instance.save()
return HttpResponseRedirect('/')
else:
form = CostForm()
render_to_response('path/to/template.html',{'form':form},context_instance=RequestContext(request))
Кроме того, я думаю, вам нужно добавить blank=True
к вашему models.ForeignKey(Project)
в модели Cost
. Это позволит вашей модели ModelForm проверить.
Ответ 3
Я сделал это следующим образом:
def save_model(self, request, obj, form, change):
obj.save()
Чтобы что-то изменить, выполните следующие действия:
obj.xyz = 'something'
obj.save()