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.
* Attachment "sample_project.zip" added.
Sample project demonstrating the issue.
* type: Uncategorized => Bug
--
Ticket URL: <https://code.djangoproject.com/ticket/29160#comment:1>
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>
* 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>
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>