【发布时间】:2014-04-16 17:49:35
【问题描述】:
我一直在看 Marty Alchin 的 Apress 书籍“ProDjango”,但在最后一章(第 11 章)遇到了问题。我是 Python 和 Django 的相对菜鸟,虽然我尝试过四处搜索,但我无法通过这个论坛和其他论坛找到类似的东西。我在这个网站上看到过Is Pro Django book still relevant?,但没有回答任何具体问题。
问题围绕着试图创建一种机制来跟踪更改 - 添加、更改和删除的历史记录。第一步是在要跟踪的模型上创建一个用户字段。在示例项目中,他创建了一个专门的 ForeignKey 字段,硬编码以与 Django 的内置“用户”模型相关:
from django.db import models
from django.contrib.auth.models import User
class CurrentUserField(models.ForeignKey):
def __init__(self, **kwargs):
super(CurrentUserField, self).__init__(User, null=True, **kwargs)
后面还有一个 'contrib_to_class() 方法。该类位于与要应用的模型不同的 models.py 文件中。
据我了解,其用途是在模型中添加一个引用此新字段类的新字段:
例如
class SimpleModel(models.Model):
a_user = CurrentUserField()
但问题是,当我 syncdb 找不到该字段时,“FieldError”是尝试访问它的常见结果。
本书的解决方案中还有许多其他元素我没有尝试在此处复制,但这是第一个也是基本的部分。
我猜想 Django 和/或 Python 本身的变化在这里负责。有没有人指点?
谢谢。
编辑:给定registration.py中的以下类,即current_user文件夹。这也是您找到包含 CurrentUserField 类的 models.py 的地方。 InformationRequest 模型具有:
user = CurrentUserField()
作为它的最后一个字段。所有导入都存在并且显示正确。
class FieldRegistry(object):
_registry = {}
def add_field(self, model, field):
reg = self.__class__._registry.setdefault(model, [])
reg.append(field)
def get_fields(self, model):
return self.__class__._registry.get(model, [])
def __contains__(self, model):
return model in self.__class__._registry
In [1]: from current_user.registration import FieldRegistry
In [2]: from inforequest.models import InformationRequest
In [3]: registry = FieldRegistry()
In [4]: registry.add_field(InformationRequest, InformationRequest._meta.get_field('user'))
---------------------------------------------------------------------------
FieldDoesNotExist Traceback (most recent call last)
<ipython-input-4-6fcbbdcae066> in <module>()
----> 1 registry.add_field(InformationRequest, InformationRequest._meta.get_field('user'))
/usr/local/lib/python2.7/dist-packages/django/db/models/options.pyc in get_field(self, name, many_to_many)
353 if f.name == name:
354 return f
--> 355 raise FieldDoesNotExist('%s has no field named %r' % (self.object_name, name))
356
357 def get_field_by_name(self, name):
FieldDoesNotExist: InformationRequest has no field named 'user'
试图查看管理员生成“未知字段...”
【问题讨论】:
-
请显示您收到的确切错误消息,包括回溯。
标签: django foreign-keys