2

I would like to be able to let users create locations "on-the-fly" when they create a report. Using the following models if possible.

models:

class Report(models.Model):
    ...
    location = forms.ManyToManyField(Location)

class Location(models.Model):
    name = forms.CharField(max_length=255)
    ...

The behavior I am searching for is close to the one given by the django formsets.

Indeed I am currently able to somewhat do that using instead a foreignkey relationship and relying on formsets. Using this technic,django-extra-views and django-dynamic-formset, I am even able to let users choose how many locations they want to add.

A strip down version of the actual setup :

models:

class Report(models.Model):
    ...

class Location(models.Model):
    name = forms.CharField(max_length=255)
    report = forms.ForeignKey('Report')

forms:

class LocationForm(forms.ModelForm):
    class Meta:
        model = Location
        fields = '__all__'

class LocationFormSet(extra_views.InlineFormSet):
    model = TestLocation
    form_class = TestLocationForm

views:

class ReportCreateView(extra_views.CreateWithInlinesView):
    model = Report
    inlines = [LocationFormSet, ]

Unfortunately using this setup, a location can not belong to more than one report which bring a lot of duplicated location. That's why I think the ManyToMany relationship would be better suited. I stumbled upon some answers related to this question that talked about intermediary model but I wasn't able to go anywhere on my own to make it work.

Is their a way to tweak my working setup to make it work with a manytomany relationship? Or does it exists a completely different approach to let user create "on-the-fly" the locations during the report creation?

Thank's!

1 Answers1

-1

For create "on-the-fly" I had changed ManyToMany by ForeingKey.

    class Report(models.Model):
        ...
        location = forms.ManyToManyField(Location)  # REMOVE

    class Location(models.Model):
        report = models.ForeignKey(Report)  # ADD
        name = forms.CharField(max_length=255)
        ...

And then, InlineForms will work.

Virako
  • 650
  • 10
  • 18