tags:

views:

199

answers:

3

I have a model:

class Cost(models.Model):
    project = models.ForeignKey(Project)
    cost = models.FloatField()
    date = models.DateField()

For the model I created a class form:

class CostForm(ModelForm):
    class Meta:
        model = Cost
fields = ['date', 'cost']

view.py:

def cost(request, offset):
    if request.method == 'POST':
        #HOW save data in DB?
        return HttpResponseRedirect('/')
    else:
        form = CostForm()

In the template file determined:

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

How save data from form in DB?
P.S. offset = project name
Model:

class Project(models.Model):
    title = models.CharField(max_length=150)
    url = models.URLField()
    manager = models.ForeignKey(User)
    timestamp = models.DateTimeField()

I tried to write:

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

But it does not work :(

A: 

A couple things dont look right.

1) Project.objects.filter() will return a queryset. use Project.ojects.get() instead... it will return just a single Project oject

2) You wont need to explicitly set the cost and date, that will be handled by your instance=form.save(commit=False)

3) you aren't using the form in your template...

Try this:

Template:

<form action="/cost/{{ project }}/" method="post" accept-charset="utf-8">
     {{form.as_p}}
     <p><input type="submit" value="Add"></p>
</form>

View:

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

Also, I think you will need to add blank=True to your models.ForeignKey(Project) in the Cost model. That will allow your ModelForm to validate.

Brant
A: 

I found the solution! Rewrote only code in view.py as follows:

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

Rest of the code is not changed.

Anry
+1  A: 

does it really work for you? does it save into the database smth?

i tried to do just as yoy have done in your answer, and it doesn't recognise the offset in project = Project.objects.get(title=offset) (of course, i've replaced offset with my variable) also, if i put offset as a parameter, it says the save() needs more parameters...i'm puzzled. Here is my prob: http://stackoverflow.com/questions/2843406/cant-save-form-content-to-database-help-plsss

thank you

dana