【问题标题】:Django admin model field set to current userDjango 管理模型字段设置为当前用户
【发布时间】:2015-07-12 10:19:35
【问题描述】:

我有一个带有字段的模型:

class MyModel(models.Model):
    name = models.CharField(max_length=50)
    created_by = models.ForeignKeyField(User)

在我的管理员中:

class MyModelAdmin(admin.ModelAdmin):
    list_display= ("name",)
    fields = ("name",)

在添加 MyModel 时,我不想在管理员中使用 created_by。我希望将其设置为当前用户,例如 created_by = request.user

我该怎么做?

谢谢

【问题讨论】:

标签: python django admin


【解决方案1】:

您已经设置了fields,这样created_by 就不会出现在 Django 管理员的表单中。

现在您需要覆盖save_model,并在保存新对象之前设置用户。

class MyModelAdmin(admin.ModelAdmin):
    fields = ("name",)

    def save_model(self, request, obj, form, change):
        if not change:
            # the object is being created, so set the user
            obj.created_by = request.user
        obj.save()

【讨论】:

  • 对我没有用...保留两个字段并尝试在字段中查看 request.user。它没有出现
  • 我不应该退货吗?模型保存后?
  • 谢谢..我必须将模型字段设置为 null 并将空白设置为 true
  • 不,save_model 不需要返回任何东西。
  • 您不必将blanknull 设置为True。我测试了上面的代码,它可以工作。
【解决方案2】:

为此,覆盖save_model 方法并将created_by 字段设置为当前用户。

class MyModelAdmin(admin.ModelAdmin):
    list_display= ("name",)
    fields = ("name",)

    def save_model(self, request, obj, form, change):             
        if not change: 
        # can use this condition also to set 'created_by'    
        # if not getattr(obj, 'created_by', None):            
            obj.created_by = request.user
        obj.save()

【讨论】:

  • 我没有在我的表单中看到用户。当我尝试在没有 created_by 的情况下保存时,它给出的错误是该字段是必需的
  • @Alasdair 更新它以检查 obj 是否设置了 created_by 属性。
  • @gamer 尝试将null=Trueblank=True 添加到created_by
  • 注释if not getattr(self, 'created_by', None) 中的行不起作用,因为selfModelAdmin 实例,而不是对象。您可以改为测试if obj.created_by,但这与测试是否正在创建对象不太一样。
  • 对不起,上面是obj。更新了答案,通过created 进行检查会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 2016-06-01
相关资源
最近更新 更多