letsgofast
letsgofast

Reputation: 257

How do add multiple fields to a Form when trying to validate data?

What is the best way to have the IP address be included with the Form is_valid. Let me start with some code examples.

urls.py

from django.conf.urls.defaults import *
from testpost.views import TestPost

urlpatterns = patterns('',
    (r'^djtestforms/', TestPost),
)

model.py

from django.db import models

class TestPostModel(models.Model):
    name = models.CharField(max_length=100)
    comment = models.CharField(max_length=100)
    ip_address = models.IPAddressField()

    def __unicode__(self):
        return self.model

    @models.permalink
    def get_absolute_url(self):
        return ('TestPostModel', [self.id])

forms.py

from django import forms
from models import TestPostModel

class TestPostForm(forms.ModelForm):
    class Meta:
        model = TestPostModel

from forms import TestPostForm
from models import TestPostModel
from django.http import HttpResponse

def TestPost(request):
    f = TestPostForm(request.POST)
    if f.is_valid():
        object = f.save()
        return HttpResponse("That worked")
    else:
        return HttpResponse("That didn't work")

My question is when I try to do "f=TestPostForm(request.POST)" what is the best way to have the IP address added to TestPostForm. I was thinking of something along the lines of "f = TestPostForm(request.POST, ip_address=request.META["REMOTE_ADDR"])" but that doesn't work. Any suggestions?

Upvotes: 0

Views: 112

Answers (2)

letsgofast
letsgofast

Reputation: 257

@czarchaic - Your'e answer gave me a good hint on what to do. I changed the model so that blank=True for ip_address, and then did a

f = TestPostForm(request.POST)
f.data['ip_address']=request.META['REMOTE_ADDR']

After that is_valid worked. Thanks.

Upvotes: 2

czarchaic
czarchaic

Reputation: 6338

Save with commit=False

form=TestPostForm(data=request.POST)
if form.is_valid():
  object=form.save(commit=False)
  object.ip_address=request.META['REMOTE_ADDR']
  object.save()

You will probably need to set blank=True in the model or required=False in the form for the form to validate

Upvotes: -1

Related Questions