[Django] #29160: Django ModelForm doesn't parse foreign keys in initial= kwarg.

3 views
Skip to first unread message

Django

unread,
Feb 24, 2018, 6:10:11 AM2/24/18
to django-...@googlegroups.com
#29160: Django ModelForm doesn't parse foreign keys in initial= kwarg.
-----------------------------------------+-------------------------
Reporter: Hameer Abbasi | Owner: nobody
Type: Uncategorized | Status: new
Component: Forms | Version: 1.11
Severity: Normal | Keywords: initial
Triage Stage: Unreviewed | Has patch: 0
Needs documentation: 0 | Needs tests: 0
Patch needs improvement: 0 | Easy pickings: 0
UI/UX: 0 |
-----------------------------------------+-------------------------
Django forms don't parse foreign keys in the `initial=` kwarg. It gives a
"NOT NULL constraint failed" even if the said data has been specified.

Relevant files:

`models.py`
{{{
#!div style="font-size: 80%"
Code highlighting:
{{{#!python
from django.db import models


class BaseModel(models.Model):
pass


# Create your models here.
class SimpleModel(models.Model):
field = models.IntegerField(default=0)
hidden_fk = models.ForeignKey(BaseModel, null=False)
}}}
}}}

`forms.py`
{{{
#!div style="font-size: 80%"
Code highlighting:
{{{#!python
from django import forms

from . import models


class SimpleForm(forms.ModelForm):
class Meta:
model = models.SimpleModel
fields = ['field']


SimpleFormset = forms.modelformset_factory(models.SimpleModel,
fields=['field'], extra=3)
}}}
}}}

`views.py`
{{{
#!div style="font-size: 80%"
Code highlighting:
{{{#!python
from django import views
from django.template import loader
from django.http import HttpResponse

from . import forms
from . import models


# Create your views here.
class FormView(views.View):
template = 'thing/form.html'

def get(self, request):
context = {'form': forms.SimpleForm()}
template = loader.get_template(self.template)

return HttpResponse(template.render(context, request))

def post(self, request):
base_model = models.BaseModel.objects.get(id=1)
form = forms.SimpleForm(request.POST, initial={'hidden_fk':
base_model})
context = {'form': form}
template = loader.get_template(self.template)

simple_model = form.save(commit=False)
simple_model.field = 1
form.save()

return HttpResponse(template.render(context, request))


class FormSetView(views.View):
template = 'thing/formset.html'

def get(self, request):
context = {'formset': forms.SimpleFormset()}
template = loader.get_template(self.template)

return HttpResponse(template.render(context, request))

def post(self, request):
base_model = models.BaseModel.objects.get(id=1)

formset = forms.SimpleFormset(
request.POST,
initial=[{'hidden_fk': base_model}] *
forms.SimpleFormset.extra
)

context = {'formset': formset}
template = loader.get_template(self.template)

if formset.is_valid():
formset.save()

return HttpResponse(template.render(context, request))
}}}
}}}

--
Ticket URL: <https://code.djangoproject.com/ticket/29160>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

Django

unread,
Feb 24, 2018, 6:10:55 AM2/24/18
to django-...@googlegroups.com
#29160: Django ModelForm doesn't parse foreign keys in initial= kwarg.
-------------------------------+--------------------------------------

Reporter: Hameer Abbasi | Owner: nobody
Type: Uncategorized | Status: new
Component: Forms | Version: 1.11
Severity: Normal | Resolution:

Keywords: initial | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Changes (by Hameer Abbasi):

* Attachment "sample_project.zip" added.

Sample project demonstrating the issue.

Django

unread,
Feb 24, 2018, 6:13:06 AM2/24/18
to django-...@googlegroups.com
#29160: Django ModelForm doesn't parse foreign keys in initial= kwarg.
-------------------------------+--------------------------------------

Reporter: Hameer Abbasi | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 1.11
Severity: Normal | Resolution:

Keywords: initial | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Changes (by Hameer Abbasi):

* type: Uncategorized => Bug


--
Ticket URL: <https://code.djangoproject.com/ticket/29160#comment:1>

Django

unread,
Feb 24, 2018, 6:14:31 AM2/24/18
to django-...@googlegroups.com
#29160: Django ModelForm doesn't parse foreign keys in initial= kwarg.
-------------------------------+--------------------------------------

Reporter: Hameer Abbasi | Owner: nobody
Type: Bug | Status: new
Component: Forms | Version: 1.11
Severity: Normal | Resolution:

Keywords: initial | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Description changed by Hameer Abbasi:

Old description:

> class BaseModel(models.Model):
> pass
>

New description:

Django forms don't parse foreign keys in the `initial=` kwarg. It gives a
"NOT NULL constraint failed" even if the said data has been specified.

This is inconvenient for forms since an `instance` can be specified but
critical for formsets where it can't.

Relevant files:


class BaseModel(models.Model):
pass

from . import models

return HttpResponse(template.render(context, request))

return HttpResponse(template.render(context, request))

return HttpResponse(template.render(context, request))

if formset.is_valid():
formset.save()

return HttpResponse(template.render(context, request))
}}}
}}}

--

--
Ticket URL: <https://code.djangoproject.com/ticket/29160#comment:2>

Django

unread,
Feb 24, 2018, 8:55:06 AM2/24/18
to django-...@googlegroups.com
#29160: Django ModelForm doesn't parse foreign keys in initial= kwarg.
-------------------------------+--------------------------------------

Reporter: Hameer Abbasi | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.11
Severity: Normal | Resolution: invalid

Keywords: initial | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------
Changes (by Tim Graham):

* status: new => closed
* resolution: => invalid


Comment:

This looks like a misunderstanding of how `Form.initial` works. From
[https://docs.djangoproject.com/en/dev/ref/forms/api/#dynamic-initial-
values the documentation]:

[`Form.initial`] values are only displayed for unbound forms, and they’re
not used as fallback values if a particular value isn’t provided.

I only looked at this briefly, so if I've misunderstood the issue please
reopen and point to the incorrect code in Django.

--
Ticket URL: <https://code.djangoproject.com/ticket/29160#comment:3>

Django

unread,
Feb 25, 2018, 9:33:46 AM2/25/18
to django-...@googlegroups.com
#29160: Django ModelForm doesn't parse foreign keys in initial= kwarg.
-------------------------------+--------------------------------------

Reporter: Hameer Abbasi | Owner: nobody
Type: Bug | Status: closed
Component: Forms | Version: 1.11
Severity: Normal | Resolution: invalid

Keywords: initial | Triage Stage: Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------+--------------------------------------

Comment (by Hameer Abbasi):

I won't reopen since you're probably right, but then there is no way to
pass an `instances=` to a `ModelFormSet`. Because of this, when certain
FKs are missing, you can't validate them later because the `ModelFormSet`
fails to validate even with `commit=False`. This is probably a separate
issue though. See https://stackoverflow.com/questions/48961675/modify-
data-in-formset-before-validation for details on what I want to do, except
I want to inject an FK.

--
Ticket URL: <https://code.djangoproject.com/ticket/29160#comment:4>

Reply all
Reply to author
Forward
0 new messages