为外键表单字段提供查询集的值

问题描述 投票:1回答:1

因此,我有两个要与ForeignKey相关的模型。在创建模型之前,我要预先填充其中一个ModelForms外键字段。来自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)

因此ListView模板将具有Car模型的基本功能,但我还想添加一个“ Wash button”,“ wash”按钮会将所选Car的pk传递给CarDetail Form模板。我在这里遇到问题。我可以从Kwargs查询汽车的PK,但似乎无法用该查询填充Form的字段或将其呈现在模板上。

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

我已经对此进行了研究,并了解到,在创建此模型的表单中,我必须覆盖_ _ init _ _函数,我不确定如何解决此问题,因为我不知道如何调用从Forms.py的Listview模板传递的kwarg 如果您可以用一些摘要或其他内容来指导我,我会很感激。预先感谢。

django foreign-keys django-class-based-views kwargs
1个回答
0
投票

我认为简单地更改ModelChoiceField用于选择的功能会更有意义。我们可以首先为汽车创建一个ModelChoiceField的子类,以通过车牌选择它:

from django import forms

class CarByLicensePlateChoiceField(forms.ModelChoiceField):

    def label_from_instance(self, obj):
        return obj.license_plate

然后在您的WashServiceForm中,我们可以使用此字段:

class WashServiceForm(forms.ModelForm):
    car = CarByLicensePlateChoiceField(queryset=Car.objects.all())

    class Meta:
        model = Car
        fields = ['car', 'detail']

然后您可以在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
© www.soinside.com 2019 - 2024. All rights reserved.