2010-04-23 76 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) 
相關問題