Reputation: 23
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.
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
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