【发布时间】:2019-11-25 04:11:17
【问题描述】:
如果表单为仅具有查看权限的用户呈现(Django 2.1 中的新功能),则在我的默认(django 管理员)更改视图中使用自定义 ModelForm 会给我一个空变量 self.fields。
这是我的代码:
# models.py
class Door(ValidateOnSaveMixin, models.Model):
...
motor_type = models.ForeignKey(
MotorType,
on_delete=models.SET_NULL,
default=None,
blank=True,
null=True)
...
door_type = models.CharField(
max_length=3,
choices=DOOR_TYPES,
null=True,
default=None)
...
vehicle_variant = models.ForeignKey(
VehicleVariant,
on_delete=models.CASCADE)
class Meta:
unique_together = ("vehicle_variant", "location", "motor_type")
...
# admin.py
@admin.register(Door)
class DoorAdmin(ImportExportModelAdmin):
form = DoorAdminForm
list_display = ('descriptor', 'get_customer_link', 'get_variant', 'location', 'get_motor_type_link',
'window_type', 'door_type', 'drum_diameter', 'dist_per_motor_rotation')
fields = ('vehicle_variant', 'description', 'location', 'motor_type',
'drum_diameter', 'window_type', 'door_type')
...
# forms.py
class DoorAdminForm(ModelForm):
class Meta:
model = Door
fields = '__all__'
widgets = {
'motor_type': DoorMotorTypeWidget,
}
def __init__(self, *args, **kwargs):
super(DoorAdminForm, self).__init__(*args, **kwargs)
# this line is crashing on access with a user who has only the view permission, as self.fields is empty
self.fields['vehicle_variant'].queryset = VehicleVariant.objects.all().prefetch_related('customer').order_by('customer__name', 'name')
根本原因与DoorAdminForm中Meta类的exclude属性有关。
无论我向字段/排除属性写入什么内容,模型的所有字段都会自动放入排除列表并防止填充self.fields。这使我的代码崩溃。
当然我可以检查'verhicle_variant' in self.fields,但我不明白这种行为的原因。我在 django 源代码中也找不到使用所有模型字段填充 exclude 属性的部分。
有人知道这是不是有意的?该行为的根本原因是什么(忽略 Meta 类的字段和排除属性)?
【问题讨论】:
标签: python django django-forms