#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:
> 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))
> }}}
> }}}
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:
`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#comment:2>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/070.b5e4f3d427568ca9fddbc68a15e7dc18%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.