Django模型管理器use_for_related_fields和ModelAdmin关系

时间:2010-06-14 15:24:42

标签: django django-admin

使用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类所代表的模型,但与之相关的一个。

1 个答案:

答案 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)

理论上,这应该有效。我还没有测试过。

相关问题