gpt4 book ai didi

python - Django InlineModelAdmin - 根据保存请求设置内联字段(自动设置用户字段)(save_formset vs save_model)

转载 作者:太空狗 更新时间:2023-10-29 17:19:35 25 4
gpt4 key购买 nike

我有两个模型,一个 MainModel 和一个相关的 InlineModel,我想在管理中显示为内联模型。例如,此 InlineModel 可用于对模型进行注释,并应跟踪登录的管理员用户所做的更改。虽然这看起来很简单(事实上,当用户字段是 MainModel 的一部分时,文档显示了一个示例),但当该字段位于 Inline 上时,我似乎无法理解它。

具体来说,我的目标是:

  1. 用户编辑 MainModel
  2. 用户添加一个InlineModel,不填写用户字段
  3. 用户按下保存
  4. 代码为新创建的 InlineModel 实例填充用户字段
  5. (奖励!用户字段对于现有实例是只读的,对于新内联是隐藏的)

还有我的问题:

  1. 这是正确的吗?太糟糕了 save_model 没有为 InlineModelAdmin 实例调用
  2. 这样做是否允许我在不导致错误的情况下进行保存? (用户是必需的,验证标记它)
  3. 如何隐藏新内联的用户输入字段,并使其对现有内联只读?

这是我目前的想法:


#models.py
class MainModel(models.Model):
some_info = models.IntegerField()

class InlineModel(models.Model):
main = models.ForeignKey(MainModel)
data = models.CharField(max_length=255)
user = models.ForeignKey('auth.User')

#admin.py
class InlineModelInline(admin.TabularInline):
model = InlineModel
fields = ('data', 'user')
#readonly_fields = ('data', 'user') #Bonus question later

class MainModelAdmin(admin.ModelAdmin):
list_display = ('id', 'some_info')
inlines = [InlineModelInline]

#def save_model(self, request, obj, form, change):
#http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model
#Only called for MainModel, not for any of the inlines
#Otherwise, would be ideal

def save_formset(self, request, form, formset, change):
#http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_formset
#Experimenting showd this is called once per formset (where the formset is a group of inlines)
#See code block at http://code.djangoproject.com/browser/django/tags/releases/1.2.1/django/contrib/admin/options.py#L894
if not isinstance(formset.model, InlineModel):
return super(MainModelAdmin, self).save_formset(request, form, formset, change)
instances = formset.save(commit=False)
for instance in instances:
if not instance.pk:
instance.user = request.user
instance.save()
formset.save_m2m()

最佳答案

我已经解决了我的问题的前半部分:

def save_formset(self, request, form, formset, change):
if formset.model != InlineModel:
return super(MainModelAdmin, self).save_formset(request, form, formset, change)
instances = formset.save(commit=False)
for instance in instances:
if not instance.pk:
instance.user = request.user
instance.save()
formset.save_m2m()

现在我对奖金行为感兴趣:

  1. 由于验证规则,我需要在添加新内联时选择用户。我最好的猜测是不在我的 InlineModelInline.fields 元组中包含“用户”字段,但这不会显示现有 InlineModel 实例的作者。 (编辑:在此处将“用户”添加到 readonly_fields 有效)

  2. (编辑)如何使现有内联将“数据”呈现为只读,但在添加新内联时仍然能够对其进行编辑?

关于python - Django InlineModelAdmin - 根据保存请求设置内联字段(自动设置用户字段)(save_formset vs save_model),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3016158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com