Phrixus
Phrixus

Reputation: 1219

ModelForm in Django fails to receive data

I have a ModelForm that all the fields are required as I want to. When I render this form in HTML, I provide all the data needed in those fields, I click submit but my form fails on is_valid validation and when I print the errors, every single input returns the following error: "This field is required."

The problem here is that I provide data to every field but seems that Django don't read them for some reason.

view

if request.POST:
        addressForm = AddressForm(request.POST, prefix="AddressForm")
        if addressForm.is_valid():
            return HttpResponseRedirect('/thanks/')
        print(addressForm.errors)

addressForm = AddressForm()
return render(request, 'index.html', {'addressForm':addressForm})

forms

class AddressForm(forms.ModelForm):
    class Meta:
        model = Address
        fields = ['AddressLine', 'StreetNumber', 'Country', 'City', 'PostalCode']

    def __init__(self, *args, **kwargs):
        super(AddressForm, self).__init__(*args, **kwargs)
        self.fields['AddressLine'].widget.attrs.update({'class' : 'form-control'})
        self.fields['StreetNumber'].widget.attrs.update({'class': 'form-control'})
        self.fields['Country'].widget.attrs.update({'class': 'form-control'})
        self.fields['City'].widget.attrs.update({'class': 'form-control'})
        self.fields['PostalCode'].widget.attrs.update({'class': 'form-control'})

Model

class Address(models.Model):
    AddressLine = models.CharField(max_length=100, blank=False)
    StreetNumber = models.CharField(max_length=100, blank=False, default=0)
    Country = models.ForeignKey(Country, blank=False)
    City = models.CharField(max_length=100, blank=False)
    PostalCode = models.CharField(max_length=10, blank=False)

HTML

<div class="row">
    <div class="form-group col-md-2">
        {{ addressForm.StreetNumber }}
    </div>
    <div class="form-group col-md-10">
        {{ addressForm.AddressLine }}
    </div>
</div>

<div class="row">
    <div class="form-group col-md-4">
        {{ addressForm.Country }}
    </div>
    <div class="form-group col-md-4">
        {{ addressForm.City }}
    </div>
    <div class="form-group col-md-4">
        {{ addressForm.PostalCode }}
    </div>
</div>

As I said the errors are:

<ul class="errorlist">
  <li>AddressLine
     <ul class="errorlist">
        <li>This field is required.</li>
     </ul>
  </li>
  <li>City
     <ul class="errorlist">
        <li>This field is required.</li>
     </ul>
  </li>
  <li>Country
     <ul class="errorlist">
        <li>This field is required.</li>
     </ul>
  </li>
  <li>PostalCode
     <ul class="errorlist">
        <li>This field is required.</li>
     </ul>
  </li>
  <li>StreetNumber
     <ul class="errorlist">
        <li>This field is required.</li>
     </ul>
  </li>
</ul>

Upvotes: 0

Views: 26

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599490

You've set a prefix on the form in the POST block, for some reason, but not in the GET case. So the fields are rendered without a prefix, but on submission the form is looking for fields with a prefix.

There doesn't seem to be any reason to use a prefix at all here; remove it.

Upvotes: 2

Related Questions