因此,我有两个要与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 如果您可以用一些摘要或其他内容来指导我,我会很感激。预先感谢。
我认为简单地更改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