2010-04-23 133 views
1

我是新来的django,所以请随时告诉我,如果我这样做不正确。我正在尝试创建一个Django订购系统。我的订单模式:如何在django admin多选字段中自定义显示和自动选择?

class Order(models.Model): 
    ordered_by = models.ForeignKey(User, limit_choices_to = {'groups__name': "Managers", 'is_active': 1}) 
在我管理任何用户都可以输入命令,但ordered_by必须有人在组“经理人”(这是我想要的行为)

现在,如果登录的用户恰好是管理员,我希望它自动使用登录的用户填写该字段。我已经做到了这一点:

class OrderAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "ordered_by": 
     if request.user in User.objects.filter(groups__name='Managers', is_active=1): 
      kwargs["initial"] = request.user.id 
     kwargs["empty_label"] = "-------------" 
     return db_field.formfield(**kwargs) 
    return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

这也适用,但管理员会将用户名作为显示在默认情况下选择框。如果列出用户的真实姓名将会很好。我能做到这一点:

class UserModelMultipleChoiceField(forms.ModelMultipleChoiceField): 
    def label_from_instance(self, obj): 
     return obj.first_name + " " + obj.last_name 
class OrderForm(forms.ModelForm): 
    ordered_by = UserModelChoiceField(queryset=User.objects.all().filter(groups__name='Managers', is_active=1)) 

class OrderAdmin(admin.ModelAdmin): 
    form = OrderForm 

我的问题:我不能对这两个。如果我放入formfield_for_foreignkey函数并添加form = OrderForm来使用我的自定义“UserModelChoiceField”,它将显示不错的名称,但不会选择当前登录的用户。我是新手,但我的猜测是,当我使用UserModelChoiceField时,它会“抹去”通过formfield_for_foreignkey传入的信息。我是否需要使用super()函数来传递这些信息?或者完全不同的东西?

回答

0

完全消除了ModelChoiceField/ModelMultipleChoiceField子类,并使用了formfield_for_foreignkey方法。 request参数在子类中不可用,因此您无法获取当前用户。

然后在formfield_for_foreignkey里面用label_from_instance方法。你可以自己写这个,但是一个强大的Django片段可以在http://djangosnippets.org/snippets/1642/处获得。只需从该片段中继承该类。你可以把它放在一个不同的文件中并导入它,或者把它写在OrderAdmin类的上面,作为OrderAdmin(NiceUserModelAdmin)

最后,重写formfield_for_foreignkey方法,在if语句之外采用kwargs["initial"] = request.user.id。我不认为这是必要的,我也无法以这种方式进行工作。

# admin.py 

from django.contrib import admin 
from django.contrib.auth.models import User 
from (...) import Order 

class NiceUserModelAdmin(admin.ModelAdmin): 
    # ... 

class OrderAdmin(NiceUserModelAdmin): 
    # ... 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     kwargs["initial"] = request.user.id 
     if db_field.name == "ordered_by": 
      kwargs["empty_label"] = "-------------" 
      return db_field.formfield(**kwargs) 
     return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 
相关问题