Thomas Murphy
Thomas Murphy

Reputation: 1468

Django Formset: Passing a parameter in each form instance

In my form set, user is able to select, project, number of hours, and date on each form.

The 'user' parameter being POSTED to the db should be the name of the authenticated user(my authentication system is working fine)

I'm unsure of how to pass this param (User) into the formset, so it is automatically submitted to the USER column on each instance of the form.

I've given RTFM 3 hours of a go, so I turn here.

views.py

def add_hours(request):

    context = RequestContext(request)

    HourFormSet = modelformset_factory(Hour, extra=5)



    if request.method == 'POST':
        formset = HourFormSet(request.POST)

        formset.save(commit=True)

        return index(request)

    else:
        formset = HourFormSet(queryset=Hour.objects.none())


    context_dict = {'formset': formset}


    return render_to_response('add_hours.html', context_dict, context)

models.py

class Hour(models.Model):
    user = models.ForeignKey(User, help_text = 'Enter your name')
    hour = models.IntegerField(default=0, help_text = 'How many hours?')
    date = models.DateField(help_text = 'Date (MM/DD/YY)')
    project = models.ForeignKey(Project, help_text = 'Select the project')

    def __unicode__(self):
        return str(self.user) + ' ' + str(self.date)
    def project_name(self):
        return self.project.name

Upvotes: 1

Views: 1591

Answers (1)

Thomas Orozco
Thomas Orozco

Reputation: 55215

First, make sure that you do not include the user in the form:

HourFormSet = modelformset_factory(Hour, extra=5, exclude=('user',))

Then, add the user before saving the instances:

if request.method == 'POST':
    formset = HourFormSet(request.POST)

    if formset.is_valid():
        instances = formset.save(commit=False)  # This will return unsaved Hour objects
        for instance in instances:
            instance.user = request.user        # Add the logged in user
            instance.save()
        return index(request)

formset = HourFormSet(queryset=Hour.objects.none())
context_dict = {'formset': formset}
return render_to_response('add_hours.html', context_dict, context)

Upvotes: 4

Related Questions