Search code examples
djangodjango-generic-viewskeyword-argumentcreate-view

Django: Set kwargs value for excluded field in generic view


Hi I am trying since yesterday.

models.py

class Event(models.Model):
    def get_absolute_url(self):
        return reverse('events:event-detail', kwargs={'pk': self.pk})

class Kategorie(models.Model):
    event = models.ForeignKey(Event)
    sport = models.ForeignKey(Sport)
    ....

urls.py

url(r'^kategorie/(?P<pk>[0-9]+)/create/$', views.KategorieCreate.as_view(), name='kategorie-create'),

html

<a href="{% url 'events:kategorie-create' event.id %}">Neue Kategorie</a>

views.py

class KategorieCreate(generic.CreateView):
    model = Kategorie
    fields = ['sport',...]       # 'event' is excluded
    template_name_suffix  = '_create_form'

    def get_context_data(self, **kwargs):
        context = super(KategorieCreate, self).get_context_data(**kwargs)
        context['event'] = kwargs.get(self.pk)
        return context

I received:

NOT NULL constraint failed: events_kategorie.event_id


Solution

  • There's no point setting that value in the context; you need to do so in the form instance. This is well documented:

    def form_valid(self, form):
        form.instance.event_id = self.kwargs['pk']
        return super(KategorieCreate, self).form_valid(form)
    

    Note, I can't actually understand what value you are trying to insert there. It makes no sense to use a category PK as the id of the event.