具有外键限制选项的 Django CreatView
Django CreatView with Foreignkey limit options
在我的模型中我有
Person:
name
Sneaker:
owner(FK) = Person.id
size
colour
Booking:
customer(FK) = Person.id
sneaker(FK) = Sneaker.id
time
price
逻辑是一个人登录后,他可以开始为他的一只运动鞋预订服务。我可以将客户设置为 request.user。但是不知何故在创建预订视图时,可以看到数据库中的所有运动鞋记录(包括他和其他客户的),但我希望客户只能 select 他自己的运动鞋。我可以对此加以限制吗?我的创建视图如下所示。谢谢!
class Booking_Create_View(CreateView):
fields = ['sneaker','time','price']
model = Booking
def form_valid(self, form):
form.instance.customer = self.request.user
return super(Booking_Create_View, self).form_valid(form)
success_url = reverse_lazy("booking_system:index")
您将需要创建一个自定义 BookingCreateForm 来接受用户关键字并过滤查询集:
forms.py
class BookingCreateForm(forms.ModelForm):
class Meta:
model = Booking
fields = ['sneaker', 'time', 'price']
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields['sneaker'].queryset = Sneaker.objects.filter(owner=user)
views.py
class Booking_Create_View(CreateView):
form_class = BookingCreateForm
def form_valid(self, form):
form.instance.customer = self.request.user
return super().form_valid(form)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
success_url = reverse_lazy("booking_system:index")
在我的模型中我有
Person:
name
Sneaker:
owner(FK) = Person.id
size
colour
Booking:
customer(FK) = Person.id
sneaker(FK) = Sneaker.id
time
price
逻辑是一个人登录后,他可以开始为他的一只运动鞋预订服务。我可以将客户设置为 request.user。但是不知何故在创建预订视图时,可以看到数据库中的所有运动鞋记录(包括他和其他客户的),但我希望客户只能 select 他自己的运动鞋。我可以对此加以限制吗?我的创建视图如下所示。谢谢!
class Booking_Create_View(CreateView):
fields = ['sneaker','time','price']
model = Booking
def form_valid(self, form):
form.instance.customer = self.request.user
return super(Booking_Create_View, self).form_valid(form)
success_url = reverse_lazy("booking_system:index")
您将需要创建一个自定义 BookingCreateForm 来接受用户关键字并过滤查询集:
forms.py
class BookingCreateForm(forms.ModelForm):
class Meta:
model = Booking
fields = ['sneaker', 'time', 'price']
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
super().__init__(*args, **kwargs)
self.fields['sneaker'].queryset = Sneaker.objects.filter(owner=user)
views.py
class Booking_Create_View(CreateView):
form_class = BookingCreateForm
def form_valid(self, form):
form.instance.customer = self.request.user
return super().form_valid(form)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user
return kwargs
success_url = reverse_lazy("booking_system:index")