2011-07-26 17 views

cevap

44

bunu tek yöneticinin de geçerli olmasını istiyorsanız Eh, eğer değil, global olarak, o zaman özel bir ModelChoiceField alt sınıf oluşturabilir, özel bir Gönderen ModelForm ve sonra kullanmak alakalı yönetici sınıfını set kullanan özelleştirilmiş formunuz. @Enrique kullandığı Person modeline FK sahip bir örnek alarak:

class Invoice(models.Model): 
     person = models.ForeignKey(Person) 
     .... 

class InvoiceAdmin(admin.ModelAdmin): 
     form = MyInvoiceAdminForm 


class MyInvoiceAdminForm(forms.ModelForm): 
    person = CustomModelChoiceField(queryset=Person.objects.all()) 
    class Meta: 
      model = Invoice 

class CustomModelChoiceField(forms.ModelChoiceField): 
    def label_from_instance(self, obj): 
     return "%s %s" % (obj.first_name, obj.last_name) 
+0

1 daha fazla şey: select girişimin yanında neden PLUS simgesi gösterilmiyor? Üzerine yazılmamış alanlar var - değiştirdiğim - NOT – robos85

8

size modelin unicode yönteminde görüntülemek istediğinizi tanımlamak zorunda https://docs.djangoproject.com/en/1.3/ref/models/instances/#unicode

class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 

    def __unicode__(self): 
     return u'%s %s' % (self.first_name, self.last_name) 

bakınız (burada ForeignKey olan).

Selamlar,

+1

Bu örnekte

, ben ebeveyn sonra ondan belirli bir alan kapmak ve .choices ayarlamak, dönüş değeri kurmak izin Bunu biliyorum, ama bunu değiştirmek için YALNIZCA 1 yerde değiştirmek istiyorum ki bu değiştirilmemeli, bu yöntem benim için iyi değil. – robos85

+0

@ robos85: Aradığın şey için cevabımı kontrol et. Sorunuzu muhtemelen güncellemeniz gerekir. –

35

bunu yaparken bir başka yolu (yararlı Eğer Sorgu Kümesi değiştirdiğinizde):

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['user'].queryset = User.objects.all() 
     self.fields['user'].label_from_instance = lambda obj: "%s %s" % (obj.last_name, obj.first_name) 

'kullanıcı' addır alanı geçersiz kılmak istersiniz. Bu çözüm size bir avantaj sağlar: queryset'i de geçersiz kılabilirsiniz (ör. User.objects.filter (username__startswith = 'a') olmasını istiyorsunuz)

Sorumluluk reddi: çözüm http://markmail.org/message/t6lp7iqnpzvlt6qp üzerinde bulundu ve test edildi. Sadece başka sorgu kümesi ile Sorgu Kümesi yerine, hatta Sorgu Kümesi kaldırıp bir seçenek listesi ile değiştirin bulmuşlardır

models.ForeignKey(ForeignStufg, verbose_name='your text') 
9

yeni versiyonları gettext ile tercüme edilebilecek bu destekler . Bunu change_view'de yapıyorum.

def change_view(self, request, object_id, form_url='', extra_context=None): 
     #get the return value which includes the form 
     ret = super().change_view(request, object_id, form_url, extra_context=extra_context) 

     # let's populate some stuff 
     form = ret.context_data['adminform'].form 

     #replace queryset with choices so that we can specify the "n/a" option 
     form.fields['blurb_location'].choices = [(None, 'Subscriber\'s Location')] + list(models.Location.objects.filter(is_corporate=False).values_list('id', 'name').order_by('name')) 
     form.fields['blurb_location'].queryset = None 

     return ret 
+0

https://docs.djangoproject.com/en/dev/topics/db/models/#verbose-field-names adresinde belgelendi. – jarmod

+5

bu aslında sorulan kişiye farklı bir problem çözüyor. –

0

: django ait

1

ilk yanıt bir alternatif:

class InvoiceAdmin(admin.ModelAdmin): 

    class CustomModelChoiceField(forms.ModelChoiceField): 
     def label_from_instance(self, obj): 
      return "%s %s" % (obj.first_name, obj.last_name) 

    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == 'person': 
      return self.CustomModelChoiceField(queryset=Person.objects) 

     return super(InvoiceAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)