Django 为ForeignKey表单字段指定Queryset的值
所以我有两个模型,我想和一个外国人联系起来。我希望在创建模型之前,预先填充其中一个模型表单的外键字段。ForeignKey中的信息来自ListView(属于客户的汽车列表)模板Django 为ForeignKey表单字段指定Queryset的值,django,foreign-keys,django-class-based-views,keyword-argument,Django,Foreign Keys,Django Class Based Views,Keyword Argument,所以我有两个模型,我想和一个外国人联系起来。我希望在创建模型之前,预先填充其中一个模型表单的外键字段。ForeignKey中的信息来自ListView(属于客户的汽车列表)模板 MODELS.PY class ClientCar(models.Model): license_plate = models.CharField(max_length=20, unique=True, name='license_plate') def__str__: pk
MODELS.PY
class ClientCar(models.Model):
license_plate = models.CharField(max_length=20, unique=True, name='license_plate')
def__str__:
pk = self.pk
license_plate = self.license_plate
return f"pk:{pk} license_plate {license_plate}"
class CarDetail(model.Model):
car = models.ForeignKey(ClientCar, on_delete=models.CASCADE, null=False)
detail = models.CharField(max_length=40, null=False)
VIEWS.PY
class WashService(LoginRequiredMixin, CreateView):
model = CarDetail
form_class = WashServiceForm
template_name = 'service_app/standard_wash_form.html'
def get_form_kwargs(self, *args, **kwargs):
kwargs = super(WashService, self).get_form_kwargs(*args, **kwargs)
ctd = ClientCar.objects.filter(pk=self.kwargs.get('pk')).values('license_plate')
kwargs['initial']['car'] = ctd
return kwargs
因此,ListView模板将具有汽车模型的基本crud,但我还想添加一个“清洗按钮”,清洗按钮将所选汽车的pk传递给CarDetail表单模板。这就是我遇到问题的地方。我可以从Kwargs查询汽车的PK,但我似乎无法用该查询填充表单的字段,也无法在模板上进行渲染
MODELS.PY
class ClientCar(models.Model):
license_plate = models.CharField(max_length=20, unique=True, name='license_plate')
def__str__:
pk = self.pk
license_plate = self.license_plate
return f"pk:{pk} license_plate {license_plate}"
class CarDetail(model.Model):
car = models.ForeignKey(ClientCar, on_delete=models.CASCADE, null=False)
detail = models.CharField(max_length=40, null=False)
VIEWS.PY
class WashService(LoginRequiredMixin, CreateView):
model = CarDetail
form_class = WashServiceForm
template_name = 'service_app/standard_wash_form.html'
def get_form_kwargs(self, *args, **kwargs):
kwargs = super(WashService, self).get_form_kwargs(*args, **kwargs)
ctd = ClientCar.objects.filter(pk=self.kwargs.get('pk')).values('license_plate')
kwargs['initial']['car'] = ctd
return kwargs
我对此进行了研究,并了解到,在创建此模型的表单中,我必须覆盖
如果你能用一些片段或任何东西来指导我,我将不胜感激。
提前感谢。我认为只需更改
modelcoocefield
用于选择的函数就更有意义了。我们可以首先为汽车创建一个子类modelcoocefield
,以按车牌选择:
from django import forms
class CarByLicensePlateChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return obj.license_plate
在CreateView
中,您可以使用属于给定主键的car
填充汽车:
from django.shortcuts import get_object_or_404
class WashService(LoginRequiredMixin, CreateView):
model = CarDetail
form_class = WashServiceForm
template_name = 'service_app/standard_wash_form.html'
def get_form_kwargs(self, *args, **kwargs):
kwargs = super().get_form_kwargs(*args, **kwargs)
initials = kwargs.setdefault('initial', {})
intial['car'] = get_object_or_404(Car, pk=self.kwargs['pk'])
return kwargs
从django.shortcuts导入get\u object\u或\u 404
类WASH服务(LoginRequiredMixin,CreateView):
型号=CarDetail
form_class=WashServiceForm
模板名称='service\u app/standard\u wash\u form.html'
def get_form_kwargs(self,*args,**kwargs):
kwargs=super().get_form_kwargs(*args,**kwargs)
initials=kwargs.setdefault('initials',{})
初始['car']=获取对象或404(car,pk=self.kwargs['pk'])
return kwargs
我认为简单地更改modelcooicefield
用于选择的函数更有意义。我们可以首先为汽车创建一个子类modelcoocefield
,以按车牌选择:
from django import forms
class CarByLicensePlateChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return obj.license_plate
在CreateView
中,您可以使用属于给定主键的car
填充汽车:
from django.shortcuts import get_object_or_404
class WashService(LoginRequiredMixin, CreateView):
model = CarDetail
form_class = WashServiceForm
template_name = 'service_app/standard_wash_form.html'
def get_form_kwargs(self, *args, **kwargs):
kwargs = super().get_form_kwargs(*args, **kwargs)
initials = kwargs.setdefault('initial', {})
intial['car'] = get_object_or_404(Car, pk=self.kwargs['pk'])
return kwargs
从django.shortcuts导入get\u object\u或\u 404
类WASH服务(LoginRequiredMixin,CreateView):
型号=CarDetail
form_class=WashServiceForm
模板名称='service\u app/standard\u wash\u form.html'
def get_form_kwargs(self,*args,**kwargs):
kwargs=super().get_form_kwargs(*args,**kwargs)
initials=kwargs.setdefault('initials',{})
初始['car']=获取对象或404(car,pk=self.kwargs['pk'])
返回kwargs
嘿,谢谢你指导我。但它只呈现了一个包含所有ClientCar对象列表的下拉按钮。谢谢你的帮助。嘿,谢谢你指导我。但它只呈现了一个包含所有ClientCar对象列表的下拉按钮。不管怎样,谢谢你的帮助。