想要从 ModelForm 中排除一些数据

Want to exclude some data from ModelForm

我尝试使带有 objectl 的表单仅链接到当前基础对象(从他们的模型中排除其他对象):

forms.py

class RoomTypeForm(ModelForm):
    class Meta:
        model = RoomType
        fields = {'Name', 'Rooms', 'Beds', 'Facilities', 'Capacity'}
        exclude = ('Building',)

    def __init__(self, *args, **kwargs):
        self.building_id = kwargs.pop('building_id')
        self.fields['Capacity'].queryset = Capacity.objects.filter(
                                           Building=self.building_id
                                           )

views.py

def building_details(request, hotel_id, building_id):
    capacity_form = CapacityForm
    roomtype_form = RoomTypeForm
    args = {}
    args.update(csrf(request))
    args['building'] = Building.objects.get(id=building_id)
    args['capacity'] = Capacity.objects.filter(Building=building_id)
    args['roomtypes'] = RoomType.objects.filter(Building=building_id)
    args['capform'] = capacity_form
    args['rtform'] = roomtype_form(building_id=building_id)
    return render_to_response('building.html', args)

但是我有错误:

'RoomTypeForm' object has no attribute 'fields'

行内:

self.fields['Capacity'].queryset = Capacity.objects.filter(Building=self.building_id)

如何才能使所有这些都起作用?请帮忙。

您需要在__init__

中调用super()class
def __init__(self, *args, **kwargs):
    self.building_id = kwargs.pop('building_id')
    super(RoomTypeForm, self).__init__(*args, **kwargs)
    self.fields['Capacity'].queryset = Capacity.objects.filter(Building=self.building_id)

或者如果您使用的是 python3,您可以这样做:

super().__init__(*args, **kwargs)

另一方面,在 fields 中指定列表或元组是标准做法。您指定了一个集合。