python - 如何从 save_formset 访问 Django 模型字段
问题描述
我在 Django 模型管理员中有一个内联模型,我需要在保存项目之前创建一个条件,这是正在使用的代码:
class PRCItemInline(admin.TabularInline):
def get_form(self, request, obj=None, **kwargs):
form = super(PRCItemInline, self).get_form(request, obj, **kwargs)
form.base_fields['product'].widget.attrs['style'] = 'width: 50px;'
return form
ordering = ['id']
model = PRCItem
extra = 1
autocomplete_fields = [
'product',
'supplier',
]
fields = (
'product', # 1
'quantity', # 2
'unitary_value_reais_updated', # 4
'issuing_status',
'approval_status',
'receiving_status',
)
readonly_fields = ['issuing_status',
'approval_status',
'receiving_status',
]
def save_formset(self, request, form, formset, change):
obj = form.instance
if obj.purchase_request.is_analizer:
return HttpResponse("You can't change this")
else:
obj.save()
如您所见,我使用该save_formset
方法能够到达模型的字段,然后根据它进行过滤。但无论我添加的 If 语句如何,它都只会保存项目。
解决方案
第一件事:
列表项save_formset
不应返回任何内容,这HttpResponse
对您不起作用。即使这样,这也不是正确的方法。更不用说它不会提供很多信息。
第一个解决方案
obj.purchase_request.is_analizer
应该在表单验证期间完成
任何ValidationError
在那里引发的内容都将传播到表单集并显示在相关表单旁边的错误消息中。
class PRCItemForm(forms.ModelForm):
def validate(self):
if obj.purchase_request.is_analizer:
raise ValidationError("You can't change this")
第二种解决方案
覆盖get_queryset()
并过滤掉您无法编辑的对象
def get_queryset(self):
qs = super().get_queryset()
return qs.exclude(purchase_request__is_analizer=True)
推荐阅读
- apache-spark - 在 spark 中验证 csv 数据的数据类型的正确方法是什么?
- python - 如何避免 Python 中的双循环?
- ubuntu - GCP 实例无法解析 fastai 资源
- regex - 特定下划线出现次数之间数据的正则表达式
- javascript - 一旦 Count up 功能达到 24 小时,它就会重置
- python - AttributeError:“numpy.ndarray”对象没有属性“sin”?
- javascript - 如何从 DatePicker 获取日期(值)并将其分配给对象的属性?
- vbscript - 当“verb”参数包含“runas”选项时,Shell.Execute 命令中的“dir”参数不起作用
- sql - 按 Oracle SQL 中其他字段中的唯一值计数
- reason - 使用组件时收到错误消息