2010-05-17 48 views
1

我已經看到了有關如何設置ModelMultipleChoiceField以使用自定義查詢集的所有howtos,並且我嘗試了它們,並且它們都可以正常工作。但是,它們都使用相同的範例:查詢集只是相同對象的過濾列表。將ModelMultipleChoiceField的查詢集動態設置爲自定義記錄集

就我而言,我試圖讓管理員繪製一個多選表單,而不是使用用戶名作爲文本部分,我想從我的帳戶類中使用name字段。

這裏是我有什麼故障:

# models.py 
class Account(models.Model): 
    name = models.CharField(max_length=128,help_text="A display name that people understand") 
    user = models.ForeignKey(User, unique=True) # Tied to the User class in settings.py 

class Organisation(models.Model): 
    administrators = models.ManyToManyField(User) 


# admin.py 
from django.forms import ModelMultipleChoiceField 
from django.contrib.auth.models import User 

class OrganisationAdminForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     from ethico.accounts.models import Account 
     self.base_fields["administrators"] = ModelMultipleChoiceField(
      queryset=User.objects.all(), 
      required=False 
     ) 
     super(OrganisationAdminForm, self).__init__(*args, **kwargs) 

class Meta: 
    model = Organisation 

這個工作,但是,我想上面queryset畫一個選擇框與Account.name屬性和User.id財產。這不起作用:

queryset=Account.objects.all().order_by("name").values_list("user","name") 

它失敗與此錯誤:

'tuple' object has no attribute 'pk' 

我想,這將是容易的,但它變成死角小時。任何人都在關注一些光明?

回答

1

您可以使用自定義小部件,覆蓋其render方法。下面是我爲一個文本字段進行:

class UserToAccount(forms.widgets.TextInput): 
    def render(self, name, value, attrs=None): 
     if isinstance(value, User) : 
      value = Account.objects.get(user=value).name 
     return super (UserToAccount, self).render(name, value, attrs=None)   

那當然,使用管理員場widget參數,以使用自定義窗口小部件。 我不知道它是否可以適應select,但你可以試試。

+0

爲什麼我被低估了?你可以解釋嗎 ? – sebpiq 2010-05-17 09:14:56

0

查詢集需要是一個QuerySet,當你做values_list時,你得到一個列表,這樣就行不通了。

如果要更改模型的默認顯示,只需覆蓋__unicode__。見http://docs.djangoproject.com/en/dev/ref/models/instances/#unicode

例如:

def __unicode__(self): 
    return u"%s for %s" % (self.name, self.user) 

Django會使用__unicode__每當你要求它打印模式。對於測試,您可以在shell中加載模型並執行print my_instance

+0

我會這樣做,除了在這種情況下,有問題的模型是用戶,我不控制。你知道我將如何調整User類的__unicode__屬性嗎? – 2010-05-17 06:40:46

0

以從sebpiq隊列,我設法弄明白:

class OrganisationAdminForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 

     from django.forms import MultipleChoiceField 
     from ethico.accounts.models import Account 

     self.base_fields["administrators"] = MultipleChoiceField(
      choices=tuple([(a.user_id, a.name) for a in Account.objects.all().order_by("name")]), 
      widget=forms.widgets.SelectMultiple, 
      required=False 
     ) 

     super(OrganisationAdminForm, self).__init__(*args, **kwargs) 

    class Meta: 
     model = Organisation 


class OrganisationAdmin(admin.ModelAdmin): 
    form = OrganisationAdminForm 


admin.site.register(Organisation, OrganisationAdmin) 

的關鍵是完全放棄了查詢集。一旦我去了一個固定的choices=參數,一切工作。感謝大家!