簡體   English   中英

在Django ModelchoiceField中過濾ForeignKey值時,結果為空

[英]Blank Result When Filtering ForeignKey values in Django ModelchoiceField

我有三個模型,它們彼此充當“外鍵”。

酒店模型

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

現在,我想以HotelCalender形式顯示屬於酒店的所有房間,以便所有者選擇他/她想要更新和保存的房間。

日歷形式

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>

查看

def hotel_calendar_view(request, hotel_id):
    if request.method=="POST":
        form=HotelCalendarForm(request.POST)
        if form.is_valid():
            data=form.cleaned_data
            newbookdate=HotelCalendar(
                user=request.user,
                hotel=Hotel.objects.get(id=hotel_id),
                hotelrooms=data['hotelrooms'],)
            newbookdate.save()
            return render(request, 'notice.html')
            #other code here

當我加載表單時,它不會返回任何值,modelchoicefield只是空白。

我想念什么?

您應該修改該行

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

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

當您過濾外鍵時,它需要一個模型實例。 如果要過濾外鍵,則必須這樣做:

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

如果您想了解更多信息,請閱讀https://docs.djangoproject.com/ja/1.9/topics/db/queries/#field-lookups

似乎當表單被加載到GET請求上時,您正在嘗試使用酒店過濾的結果填充hotelrooms字段。 如果是這種情況,則該字段將不會加載任何數據,因為instance變量將為None

對於初始數據,您需要在GET請求中初始化酒店ID時將其傳遞給表單,並在表單中使用酒店ID而不是instance.hotel_id加載數據。 例如:

views.py

@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

然后以您的形式:

forms.py

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM