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

-- 
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/055.260b4978a50379e522277c2f24dbfc78%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to