使用Admin界面时,我无法让模型管理器正常运行。基本上,我有两个模型:
class Employee(models.Model):
objects = models.EmployeeManager()
username = models.CharField(max_length=45, primary_key=True)
. . .
class Eotm(models.Model): #Employee of the Month
date = models.DateField()
employee = models.ForeignKey(Employee)
. . .
我有一个EmployeeManager
类来覆盖get()
方法,如下所示:
class EmployeeManager(models.Manager):
use_for_related_fields = True
def get(self, *arguments, **keywords):
try:
return super(EmployeeManager, self).get(*arguments, **keywords)
except self.model.DoesNotExist:
#If there is no Employee matching query, try an LDAP lookup and create
#a model instance for the result, if there is one.
基本上,我们的想法是,如果数据库中不存在{Active Directory中的信息,则会自动创建Employee
个对象。这在我的应用程序代码中运行良好,但是当我尝试为Eotm
模型创建Django管理页面时,情况并不是那么好。我使用ForeignKey
窗口小部件替换了TextInput
字段的默认窗口小部件,因此用户可以键入用户名(因为username
是主键)。从理论上讲,这应该调用EmployeeManager.get(username='whatever')
,它可以像默认管理器一样返回Employee
,也可以创建一个,如果还不存在则返回它。问题是,我的经理没有被使用。
除了generic manager documentation之外,我在Django文档中找不到有关使用自定义Manager
类和管理站点的任何内容。我找到了blog entry,其中讨论了为ModelAdmin
类指定自定义管理器,但这并没有真正帮助,因为我不想更改ModelAdmin
类所代表的模型,但与之相关的一个。
答案 0 :(得分:0)
我可能不理解您在这里尝试做什么,但您可以为Eotm模型使用自定义表单:
#admin.py
from forms import EotmAdminForm
class EotmAdmin(models.ModelAdmin):
form = EotmAdminForm
#forms.py
from django import forms
from models import Eotm, Employee
class EotmAdminForm(forms.ModelForm)
class Meta:
model = Eotm
def clean_employee(self):
username = self.cleaned_data['employee']
return Employee.get(username=username)
理论上,这应该有效。我还没有测试过。