Django 为ForeignKey表单字段指定Queryset的值

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

所以我有两个模型,我想和一个外国人联系起来。我希望在创建模型之前,预先填充其中一个模型表单的外键字段。ForeignKey中的信息来自ListView(属于客户的汽车列表)模板

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对象列表的下拉按钮。不管怎样,谢谢你的帮助。