Rooterle
Rooterle

Reputation: 393

Django form.save() error

my model:

class Event(models.Model):
    title = models.CharField(max_length=255)
    start = models.DateTimeField()
    end = models.DateTimeField()
    theme = models.ForeignKey(Theme)

class Theme(models.Model):
    name = models.CharField(max_length=100)
    color = models.CharField(max_length=50)
    text_color = models.CharField(max_length=50)

my form:

class EventForm(ModelForm):
    class Meta:
        model = Event
        fields = ['title', 'start', 'end']

    theme = forms.ModelChoiceField(
        queryset=Theme.objects.filter(public=True),
        empty_label='None'
    )

my view:

@login_required
    def index(request):
        if request.method == 'POST':
            form = EventForm(request.POST)
            if form.is_valid():
                form.save()

Now If I fill in the values in the form star, end, title and select a theme from a list that django creates for me I get an error when I try to run the form.save() method.

IntegrityError: null value in column "theme_id" violates not-null constraint

But when I look into form.cleaned_data I can see that in theme is an instance of my Theme model available.

Upvotes: 1

Views: 3078

Answers (2)

varnothing
varnothing

Reputation: 1299

I should have commented but I don't have enough point. I think better way to achieve this thing is:

class EventForm(ModelForm):
    class Meta:
        model = Event
        fields = ['title', 'start', 'end', 'theme']

As 'theme' is foreign key to Event Model, it'll appear as drop down on your template. As here you want to filter theme objects, you can achieve it by overriding init :

class EventForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super(EventForm, self).__init__(*args, **kwargs)
        self.fields['theme'].queryset = self.fields['theme'].queryset.filter(public=True)
    class Meta:
        model = Event
        fields = ['title', 'start', 'end', 'theme']

Upvotes: 0

doniyor
doniyor

Reputation: 37876

you cannot save Event without Theme object, so you need something like

form = EventForm(request.POST)
if form.is_valid():
    # get your Theme object 'your_theme_object'
    event = form.save(commit=False)
    event.theme = your_theme_object
    event.save()

Upvotes: 1

Related Questions