#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.

Reply via email to