autosnake
autosnake

Reputation: 23

How can one html form input field update two Django models?

I have two models, Region and Room. One room can only be in one region but one region can have many rooms. When the user is creating a room (createRoom view), I want them to enter a region, which should both update the Region model and also assign this Region to the room.

models.py

class Region(models.Model):
    region = models.CharField(max_length=200, unique=True)
    etc....

class Room(models.Model):
    region = models.ForeignKey(Region, on_delete=models.SET_NULL, null=True)
    etc....

forms.py

class RoomForm(ModelForm):
    class Meta:
        model = Room
        fields = ['region', etc....]

class RegionForm(ModelForm):
    class Meta:
        model=Region
        fields = ['country', 'region']

views.py

def createRoom(request):
    form_room = RoomForm()
    form_region = RegionForm()

    if request.method == 'POST':
        form_room = RoomForm(request.POST)
        form_region = RegionForm(request.POST)
        if form_room.is_valid() and form_region.is_valid():
            room = form_room.save(commit=False)
            region = form_region.save(commit=False)
            room.region = region.region
            room.save()
            region.save()
            return redirect ('home')

template.html

          <form class="form" action="" method="POST">
            {% csrf_token %}
            {{form_room.media}}

            <div class="form__group">
              <label for="region_name">Region</label>
              {{form_region.region}}
            </div>


</form>

The line room.region = region.region in views.py I was hoping would set the region object of the Region model as the region object of the Room model. I receive no errors when submitting the form. However the Room model's region object stays empty.


I updated my views to check for errors and the error seems to be that the forms are not valid:

def createRoom(request):
    form_room = RoomForm()
    form_region = RegionForm()

    if request.method == 'POST':
        form_room = RoomForm(request.POST)
        form_region = RegionForm(request.POST)
        if form_room.is_valid() and form_region.is_valid():
            room = form_room.save(commit=False)
            region = form_region.save(commit=False)
            room.host = request.user
            room.region = region.region.pk
            region.save()
            room.save()
        #return redirect ('home')
        else:
                messages.error(request, 'form not valid')

Upvotes: 0

Views: 49

Answers (1)

haduki
haduki

Reputation: 940

Im assuming that since you are creating two models in one form, order plays a big role here. You are trying to save room with a ForeignKey region when this model instance does not exist. Try swapping the order:

region.save()
room.save()

That way you first save the Region and then the data in the Room is not empty. Also try using try except: for better error handling. Finally keep in mind that ForeignKey requires a key so you might need to set

room.region = region.pk

Upvotes: 1

Related Questions