Как сохранить данные из ModelForm в базу данных в Django? - PullRequest
13 голосов
/ 15 мая 2010

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

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()

Моя попытка

Я пытался реализовать решение следующим образом (примечание: смещение = название проекта):

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()

Но это не работает: (

Ответы [ 3 ]

13 голосов
/ 15 мая 2010

Пара вещей выглядит не так:

  1. Project.objects.filter() вернет набор запросов. Вместо этого используйте Project.objects.get() ... он вернет только один Project объект

  2. Вам не нужно явно устанавливать стоимость и дату, которые будут обрабатываться вашим instance=form.save(commit=False)

  3. Вы не используете форму в своем шаблоне ...

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

Шаблон:

<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 для проверки.

10 голосов
/ 15 мая 2010

Я нашел решение. 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('/')

Остальная часть кода не изменилась.

1 голос
/ 01 июня 2015

Я сделал это так:

def save_model(self, request, obj, form, change):
    obj.save()

Чтобы что-то изменить, сделайте это через:

obj.xyz = 'something'
obj.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...