如何将当前登录的用户指定为模型字段的默认值?

Nac*_*cho 14 django django-models

我想做这样的事情:

class Task(models.Model):
    ...
    created_by = models.ForeignKey(User, **default=[LoggedInUser]** blank=True, null=True, related_name='created_by')
Run Code Online (Sandbox Code Playgroud)

这可能吗?除了在视图中执行request.user之外,我无法找到获取登录用户的正确方法,这在此处似乎不起作用.

PS_我意识到我可以通过其他方式初始化Model数据,但我认为这是最干净的方法.

sca*_*eos 28

如果要在管理界面中实现此目的,可以使用save_model方法.见下面的例子:

class List(models.Model):
    title = models.CharField(max_length=64)
    author = models.ForeignKey(User)

class ListAdmin(admin.ModelAdmin):
    fields = ('title',)
    def save_model(self, request, obj, form, change):
        obj.author = request.user
        obj.save()
Run Code Online (Sandbox Code Playgroud)


Pet*_*ell 6

不,你不能这样做.Django(和Python)几乎没有全局值,这是一件好事(tm).通常,您会在当前用户view(request)使用request.user.然后,您可以将其作为参数传递给各种方法/函数,但尝试设置全局user只会导致多线程环境中的撕裂.

应该有一个保险杠贴纸上写着,Globals是邪恶的.这将使您对PHP的第一个问题有所了解.


Die*_*gan 6

已解决:\n我将使用一个示例,但重要的部分是views.py 上的函数。\n用户可通过 django 自动获得。\n请注意,\'autor\' 模型字段具有指向 \'User\' 的外键.\n在下面的“def form_valid”中,我将当前登录的用户指定为默认值。

\n\n

如果这是您的型号:

\n\n
class ProspectoAccion(models.Model):\n"""\nModel representing a comment against a blog post.\n"""\n    descripcion = models.TextField(max_length=1000)\n    autor = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)\n    accion_date = models.DateTimeField(auto_now_add=True)\n    prospecto= models.ForeignKey(Prospecto, on_delete=models.CASCADE)\n    tipo_accion = models.ForeignKey(\'Accion\', on_delete=models.SET_NULL, null=True)\n
Run Code Online (Sandbox Code Playgroud)\n\n

并且您有一个基于类的视图,请执行以下操作:

\n\n
class ProspectoAccionCreate(LoginRequiredMixin, CreateView):\n"""\nForm for adding una acci\xc3\xb3n. Requires login (despues poner)\n"""\n    model = ProspectoAccion\n    fields = [\'tipo_accion\',\'descripcion\',]\n\n    def form_valid(self, form):\n\n        #Add logged-in user as autor of comment THIS IS THE KEY TO THE SOLUTION\n        form.instance.autor = self.request.user\n\n        # Call super-class form validation behaviour\n        return super(ProspectoAccionCreate, self).form_valid(form)\n
Run Code Online (Sandbox Code Playgroud)\n\n

以下是文档中的示例:\n https://docs.djangoproject.com/en/2.0/topics/class-based-views/generic-editing/#models-and-request-user

\n

  • 完美的!正是我想要的 (2认同)