django - Django Inline:如何在 change_view() django 中获取内联属性
问题描述
电子邮件模型类
class Email(models.Model)
body_message = models.TextField(max_length = 256, null = False)
#other fields ForeignKey, subject, to etc.
表格内联模型。
#Inline Email
class EmailInline(admin.TabularInline):
model = Email
这是我的 RequestAdmin 模型,它显示内联。
class RequestAdmin(admin.ModelAdmin):
inlines = [EmailInline,]
#In change_view() i want to print my inlines properties
def change_view(self, request, object_id, form_url='', extra_context=None):
for inline in self.inlines:
#Here i can remove my specific inline
self.inlines.remove(inline)
#But i want to check my inline_class properties
print(inline.body_message) #This line raise exception
#i want to print inlines body_message
return super(RequestAdmin, self).change_view(request, object_id)
我得到的错误图像。
异常值:
类型对象“EmailInline”没有属性“body_message”
现在我怎样才能得到我的内联属性(body_message)?
解决方案
我想我更好地理解了您的问题-您想影响正在填充到内联表单中的实际对象,并根据body_message
属性的内容隐藏某些对象。在这种情况下,您可以覆盖该InlineModelAdmin.get_queryset
方法,这将使您有机会排除某些项目;或ModelAdmin.get_inline_formsets
方法,它使您有机会更改将为内联对象生成的表单:
from django.contrib.admin.options import TabularInline
class EmailInline(TabularInline):
model = Email
# If you want to manipulate the query used to select the related objects:
def get_queryset(self, request):
queryset = super(EmailInline, self).get_queryset(request)
modified_queryset = queryset.exclude(body_message__contains='some string')
return modified_queryset
class RequestAdmin(admin.ModelAdmin):
inlines = [EmailInline, ]
# If you wanted to manipulate the inline forms, to make one of the fields read-only:
def get_inline_formsets(self, request, formsets, inline_instances, obj=None):
inline_admin_formsets = []
for inline, formset in zip(inline_instances, formsets):
fieldsets = list(inline.get_fieldsets(request, obj))
readonly = list(inline.get_readonly_fields(request, obj))
prepopulated = dict(inline.get_prepopulated_fields(request, obj))
inline_admin_formset = helpers.InlineAdminFormSet(
inline, formset, fieldsets, prepopulated, readonly,
model_admin=self,
)
# Custom code here - analyze the forms/objects, make changes to the form if desired:
if isinstance(inline, EmailInline):
for form in inline_admin_formset.forms:
if 'some string' in form.instance.body_message:
# this adds the "readonly" attribute to the input widget for the `body_message` field:
form.fields['body_message'].widget.attrs['readonly'] = True
inline_admin_formsets.append(inline_admin_formset)
return inline_admin_formsets
推荐阅读
- ios - 如何使用 Swift 验证 UserDefault 值将或为空
- rust - 如何使用 nom 解析稍微模棱两可的数据?
- html - 如何在带有容器的 div 中保持图像与动画的纵横比?
- wordpress - 为什么我们不应该在 wordpress 多站点中使用“www”
- html - 设置颜色时在悬停时更改表格行的颜色
- bash - 如何在 docker 容器中执行期望脚本
- android - Mapstruct kotlin 和 @Named 注解
- javascript - 在 JavaScript 中操作数组值
- c# - 覆盖现有记录
- javascript - 比较两个字符串并返回两者都不存在的值