【问题标题】:Automatically populate a model field with FK to User in Django使用 FK 自动将模型字段填充到 Django 中的用户
【发布时间】:2014-12-26 09:25:00
【问题描述】:

我有这个小 models.py 文件:

models.py

# -*- coding: utf-8 -*-
import datetime

from django.db import models
from django.contrib.auth.models import User

from apps.strumento.models import Strumento, Veicolo

class AllegatoStrumento(models.Model):
    allegato = models.FileField(upload_to='uploads_strumento/', blank=True, null=True)
    data_creazione = models.DateTimeField(default=datetime.datetime.now)
    creatore = models.ForeignKey(User)
    strumento = models.ForeignKey(Strumento)

    class Meta:
        verbose_name_plural = "Allegati strumenti"
        verbose_name = "Allegato strumento"

    def __unicode__(self):
        return str(self.allegato)

我希望“creatore”字段自动填充触发保存/更新操作的登录用户,以便我可以显示它但不允许直接更改它。

当然,只是将这样的 User FK 放入模型中,它会询问我要放入哪个用户,这是我不希望发生的。

这两行我都试过了:

creatore = models.ForeignKey(User, default=request.user.get_username())
creatore = models.ForeignKey(User, default=User.get_username())

但它们都不起作用,因为第一个错过了 request 的实例,而第二个抱怨该方法是 NOT (已更正,感谢@bruno desthuilliers)被调用在一个实例上(“TypeError: 未绑定的方法 get_username() 必须以用户实例作为第一个参数调用(什么都没有)”)

有什么简单的方法可以做到这一点?

【问题讨论】:

标签: python django


【解决方案1】:

模型没有“神奇”访问“当前请求”的事实是设计使然 - 因为不一定存在“当前请求”之类的东西,即从命令处理模型时 -行脚本等。

处理问题的正确方法是从您的视图中显式传入“当前用户”(将请求作为第一个参数)。

附注

  1. AllegatoStrumento.__unicode__ 的实现已损坏(__unicode__ 必须返回 unicode 对象,而不是 str 对象 - 提示:django 模型中的所有文本字段都返回 unicode )

  2. 您在模型本身中提供默认值的第二次尝试抱怨 get_username() 在实例上调用

  3. 无论如何,您的字段需要一个 User 实例,而不是用户名,因此对 get_username() 的调用太离谱了。

【讨论】:

  • 好的,所以我必须处理视图。当我使用管理模块时,这意味着我必须扩展一些管理视图。我会看看我能做什么,谢谢。关于其他几点:1)也许“return unicode(self.allegato).encode('utf-8')”效果更好? 2)我的失误。我的意图与你所说的完全一样。 3) 没错,这更像是一个测试,看看我是否能以某种方式处理用户。事实上,将用户名作为对用户的引用根本不在我的计划中,因为无论如何这都不是一个好主意。
  • stackoverflow.com/a/2414725/41316 的管理员中有一个关于如何处理此问题的示例。关于__unicode__ 方法,self.allegato已经是一个 unicode 对象,所以没有什么比return self.allegato 更多的事情要做了。 FWIW,将其编码为 utf8 将使其再次成为字符串(一个 utf-8 编码的字符串),而不是 unicode ...
  • 是的,我现在确实正在阅读该链接,谢谢。根据 unicode 问题,我认为我曾经在对象表示方面遇到问题(打印出“对象”而不是可读名称等),并且将 str 作为返回对象似乎正在工作。我会回想并尝试正确地做到这一点。不幸的是,我对 python 和 django 都是新手,所以现在的方式有点难。不过,感谢您指出。
  • 抱歉,我刚刚注意到 allegratoFileField。所以你想要的是return unicode(self.allegato)(或return u"%s" % self.allegato)。重点是返回 unicode 字符串(unicode 类型),而不是字节字符串(str 类型)。
  • 啊,好吧,现在更有意义了。无论如何,我已经选择了 unicode(self.allegato),我将以同样的方式通过我的项目修复所有类似的错误。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
相关资源
最近更新 更多