我有两种型号,机器和设备
class Machine(models.Model):
pass
class Device(models.Model):
machine = models.ForeignKey(Machine, related_name='devices')
Run Code Online (Sandbox Code Playgroud)
现在在Django Admin中,在Machine change页面中,我希望能够添加1-N Device引用,它很好用,并且具有ManyToMany关系,这是它在admin中的外观(期望)
我正在尝试forms.ModelMultipleChoiceField
用于1:N选择。我已经想出了保存这种关系的方法,但是提供初始值似乎并不起作用。
我如何尝试提供初始值:
class MachineForm(forms.ModelForm):
class Meta:
model = Machine
fields = '__all__'
devices = forms.ModelMultipleChoiceField(queryset=Device.objects.filter(machine=None).all(), required=False)
def __init__(self, *args, **kwargs):
super(MachineForm, self).__init__(*args, **kwargs)
if self.instance:
self.fields['devices'].initial = self.instance.devices.all()
def save(self, *args, **kwargs):
instance = super(MachineForm, self).save(commit=False)
self.fields['devices'].initial.update(machine=None)
instance.save()
self.cleaned_data['devices'].update(machine=instance)
return instance
Run Code Online (Sandbox Code Playgroud)
在调试器中,我可以清楚地知道初始查询集是非空的:
initial <QuerySet [<Device: 10126>, <Device: 10127>]>
但是django admin中的字段仍然为空。
有人知道为什么吗?
编辑:
我已经试过了
self.fields['devices'].initial = self.instance.devices.all().values_list('id', flat=True)
没有运气。
编辑2:
调试日志来自 self.fields['devices'].__dict__
[api-857c7fc84d-rh42v api-app] empty_label -> None
[api-857c7fc84d-rh42v api-app] required -> False
[api-857c7fc84d-rh42v api-app] label -> None
[api-857c7fc84d-rh42v api-app] initial -> <QuerySet [<Device: 10126>, <Device: 10127>]>
[api-857c7fc84d-rh42v api-app] show_hidden_initial -> False
[api-857c7fc84d-rh42v api-app] help_text ->
[api-857c7fc84d-rh42v api-app] disabled -> False
[api-857c7fc84d-rh42v api-app] label_suffix -> None
[api-857c7fc84d-rh42v api-app] localize -> False
[api-857c7fc84d-rh42v api-app] widget -> <django.forms.widgets.SelectMultiple object at 0x7f7d749597f0>
[api-857c7fc84d-rh42v api-app] error_messages -> {'required': 'This field is required.', 'invalid_choice': 'Select a valid choice. %(value)s is not one of the available choices.', 'list': 'Enter a list of values.', 'invalid_pk_value': '"%(pk)s" is not a valid value.'}
[api-857c7fc84d-rh42v api-app] validators -> []
[api-857c7fc84d-rh42v api-app] _queryset -> <QuerySet [<Device: 10036>, <Device: 10135>, <Device: 10062>, <Device: 10069>, <Device: 10101>, <Device: 10139>, <Device: 10022>, <Device: 10149>, <Device: 10103>, <Device: 10146>, <Device: 10020>, <Device: 10040>, <Device: 10075>, <Device: 10123>, <Device: 10059>, <Device: 10001>, <Device: 10142>, <Device: 10148>, <Device: 10097>, <Device: 10118>, '...(remaining elements truncated)...']>
Run Code Online (Sandbox Code Playgroud)
小部件为dict:
[api-66c9c5d85c-qtnrq api-app] attrs -> {}
[api-66c9c5d85c-qtnrq api-app] choices -> <django.forms.models.ModelChoiceIterator object at 0x7f6c73ad4ac8>
[api-66c9c5d85c-qtnrq api-app] is_required -> False
Run Code Online (Sandbox Code Playgroud)