【问题标题】:Automatically fill a field with the name of the user that creates the object?使用创建对象的用户名自动填充字段?
【发布时间】:2015-11-23 14:04:51
【问题描述】:

我有一个模特,Package:

class Package(models.Model):
    VIP = models.BooleanField()
    name = models.CharField(max_length=200)
    contents = models.CharField(max_length=200)
    owner = # username that created this object

每当用户添加新的Package(通过管理员)时,我希望owner 包含该用户的名称。我该怎么做?

【问题讨论】:

  • 这太模糊了。 Package 是如何添加的?通过形式?通过管理员?
  • 我们需要有关以下几项的更多信息:(1.) 您在哪里创建它(如尚旺所说)? (2.) 什么样的用户?你的另一个模型? auth.User 的子类?某个 3rd 方包的用户模型?
  • 如果您在视图中创建对象,您可以从请求中获取用户。
  • @ShangWang 通过管理员。

标签: django django-admin


【解决方案1】:

如果要在admin中隐藏owner字段,则将owner字段从model admin中排除,并在save_model方法中设置owner。

class PackageAdmin(admin.ModelAdmin):
    exclude = ('owner',)

    def save_model(self, request, obj, form, change):
        if not change:
            # only set owner when object is first created
            obj.owner = request.user
        obj.save()

如果要保留表单的所有者字段,则覆盖get_changeform_initial_data,并将所有者添加为初始值。

class PackageAdmin(admin.ModelAdmin):
    def get_changeform_initial_data(self, request):
        return {'owner': request.user}

上面的代码假定所有者是用户模型的外键,这是我推荐的方法。如果您确实想将用户名存储为字符串,则需要将上面的行更改为:

obj.owner = request.user.username

return {'owner': request.user.username}

【讨论】:

  • 这是一个解决方案。但我不想向管理员隐藏 owner 字段。相反,我希望默认值是第一次创建对象的用户。有没有办法做到这一点? 如果你找到了方法,请不要删除之前的答案,因为它也很有用
  • 我添加了另一种方法来保留所有者表单字段。
  • get_form 给了我一个错误:modelform_factory() got an unexpected keyword argument 'initial'。你测试过这个吗?我正在使用 django 1.7
  • 不,我没有测试过代码。我已经更新了答案,请尝试覆盖 get_changeform_initial_data
猜你喜欢
  • 1970-01-01
  • 2013-10-17
  • 2020-11-11
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2021-04-09
相关资源
最近更新 更多