我一直在看Marty Alchin的Apress书“ProDjango”,我在最后一章(第11章)遇到了一个问题。我是Python和Django的相对noob,尽管我已经尝试过搜索,但我不能通过这个和其他论坛来指出类似的东西。我在这个网站上看过Is Pro Django book still relevant?但没有回答任何具体问题。
问题围绕着尝试创建跟踪变更的机制 - 添加,更改和删除的历史记录。第一步是在要跟踪的模型上创建用户字段。在示例项目中,他创建了一个专门的ForeignKey字段,硬编码与Django的内置“User”模型相关:
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文件中。
据我所知,使用是在模型中添加一个引用这个新字段类的新字段:
e.g。
class SimpleModel(models.Model):
a_user = CurrentUserField()
但问题是,当我在syncdb中无法找到该字段时,尝试访问它时会出现“FieldError”。
本书的解决方案中还有许多其他元素我没有尝试过这里复制,但这是第一个也是基本的部分。
我猜这里Django和/或Python本身的变化是负责任的。有没有人指点?
感谢。
编辑:在registration.py中给出以下类,这是current_user文件夹。这也是您发现models.py持有CurrentUserField类的地方。 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'
尝试查看管理员会生成“未知字段...”
答案 0 :(得分:0)
我想我已经找到了我的问题的答案:django-simple-history(https://django-simple-history.readthedocs.org/en/latest/),因为它提供了我试图实现的解决方案的一部分,显然它是建立在Marty Alchin的Pro代码中的Django的。