#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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
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