Python 过滤Django ModelchoiceField中的ForeignKey值时的空白结果

Python 过滤Django ModelchoiceField中的ForeignKey值时的空白结果,python,django,django-models,django-views,Python,Django,Django Models,Django Views,我有三个模型,它们互相充当“外键” 酒店模型 class Hotel(model.Models): user= models.ForeignKey(User) name= models.CharField(max_length=100, verbose_name='hotel_name') address= models.CharField(max_length=100, verbose_name='hotel_address') #more fields 房间模型 clas

我有三个模型,它们互相充当“外键”

酒店模型

class Hotel(model.Models):
  user= models.ForeignKey(User)
  name= models.CharField(max_length=100, verbose_name='hotel_name')
  address= models.CharField(max_length=100, verbose_name='hotel_address') 
  #more fields
房间模型

class HotelRooms(models.Model):
    hotel= models.ForeignKey(Hotel, related_name='myhotels')
    slug=models.SlugField(max_length=100, unique=True)
    room_name=models.CharField(max_length=100, verbose_name='Room Name')
    #other fields
日历模型酒店

class HotelCalendar(models.Model):
    user=models.ForeignKey(User)
    hotel=models.ForeignKey(Hotel)
    hotelrooms=models.ForeignKey(HotelRooms)
     #other fields
现在,我想在HotelCalendar表单中显示属于酒店的所有房间,以便所有者选择要更新和保存的房间

酒店日历表

class HotelCalendarForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(HotelCalendarForm, self).__init__(*args, **kwargs)
        self.fields['hotelrooms'].queryset=  HotelRooms.objects.filter(hotel=self.instance.hotel_id)
模板

<form id="post_form" method="post" action=""
      enctype="multipart/form-data">

     {% csrf_token %}

     {{  HotelCalendarForm.as_p }}


    <input type="submit" name="submit" value="Submit" />
</form>
当我加载表单时,它不会返回任何值,modelchoicefield只是空白


我遗漏了什么?

您应该修改该行

self.fields['hotelrooms'].queryset = HotelRooms.objects.filter(hotel=self.instance.hotel_id)

当您在外键上进行筛选时,它需要一个模型实例。如果您想在外键上进行筛选,则必须按以下方式进行:

HotelRooms.objects.filter(hotel_id=self.instance.hotel_id)

如果您想了解更多信息,请阅读当表单加载到GET请求时,您似乎正在尝试使用酒店过滤的结果填充
hotelrooms
字段。如果是这种情况,字段将不会加载任何数据,因为
实例
变量将为

对于初始数据,在GET请求和表单中初始化时需要将hotel id传递给表单,请使用hotel id而不是
实例加载数据。hotel_id
。例如:

views.py 然后以你的形式:

forms.py
检查HotelRooms.objects.filter(hotel=self.instance.hotel\u id)是否返回任何内容…它不返回任何内容。这是因为self.instance是
None
。感谢您的回复。我这样做了,self.fields['hotelrooms'].queryset=hotelrooms.objects.filter(hotel=self.instance.hotel),它在模板中没有显示任何表单。我的模板和我在问题中写的一样。我也尝试过这个,HotelRooms.objects.filter(hotel\u id=self.instance.hotel\u id)字段返回空白字段。。没有返回任何值。也许你只是没有酒店房间?
self.fields['hotelrooms'].queryset = HotelRooms.objects.filter(hotel=self.instance.hotel)
HotelRooms.objects.filter(hotel_id=self.instance.hotel_id)
@login_required
def hotel_calendar_view(request, hotel_id):
    if request.method=="POST":
        ## code to post the form data
    else:
        context = {
            'HotelCalendarForm’: HotelCalendarForm(hotel_id=hotel_id),
            'hotel': Hotel.objects.get(id=hotel_id)
        }
        return render(request, 'hotels/hotel_calendar.html', context)
    # return default response
class HotelCalendarForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        hotel_id = kwargs.pop(“hotel_id”, None)
        super(HotelCalendarForm, self).__init__(*args, **kwargs)
        if hotel_id:
            self.fields['hotelrooms'].queryset=HotelRooms.objects.filter(hotel=hotel_id)