finspin
finspin

Reputation: 4061

Storing form data in the database

I can't figure out how to store a simple form in the database. I think I'm quite close but there is probably something wrong in my views.py. Here is my code, any ideas what I'm doing wrong? (also on dpaste)

# models.py
class IngredienceCategory(models.Model):
    name = models.CharField(max_length=30, unique=True)
    user = models.ForeignKey(User, null=True, blank=True)

    class Meta:
    verbose_name_plural = "Ingredience Categories"

    def __unicode__(self):
        return self.name

# forms.py
class CategoryForm(forms.Form):
    name = forms.CharField(max_length=30)

# views.py
@login_required
def newCategory(request):
    if request.method == 'POST':
        username = request.user.username
        cform = CategoryForm(request.POST)
        if cform.is_valid():
            formInstance = cform.save(commit = False)
            formInstance.user = username
            formInstance.name = cform.cleaned_data['name']
            formInstance =  IngredienceCategory.objects.filter(name=formInstance.name, user=formInstance.user)
            formInstance.save()
            # return HttpResponseRedirect('new-category/')
    else:
        form = CategoryForm()

    context = {'form': form}

    return render_to_response('new-category.html', context, context_instance=RequestContext(request))

# new-category.html
<h3>Insert New Category</h3>
<form action="/" method="post" id="food-form">{% csrf_token %} 
{{ form.as_p }}
<input type="submit" name="foodForm" value="Save" />
</form>

Upvotes: 0

Views: 3321

Answers (2)

relekang
relekang

Reputation: 1884

The line below is not useful at it current position. That command will perform a database query and assign the result as a queryset, before you have saved the form data.

formInstance =  IngredienceCategory.objects.filter(name=formInstance.name, user=formInstance.user)

This should work:

With cform as a normal Form:

if cform.is_valid():
    formInstance = IngredienceCategory(user=request.user, cform.cleaned_data['name'])
    formInstance.save()

If cform had been a ModelForm you could do:

if cform.is_valid():
    formInstance = cform.save(commit=False)
    formInstance.user = request.user
    formInstance.save()

I do recommend you to check out ModelForms since it will build the cleaning functionality based on your model.

Upvotes: 2

Ankur Gupta
Ankur Gupta

Reputation: 2300

You should inherit from ModelForm

from django.forms import ModelForm class CategoryForm(ModelForm): class Meta: model = IngredienceCategory

Refer to https://docs.djangoproject.com/en/dev/topics/forms/modelforms/ for how to render form and save it to database.

Upvotes: 0

Related Questions