2010-10-19 17 views
13

model formundaki kullanıcı adı Ben ForeignKey(User) alanına başvuran bir modelim var.Django show get_full_name() yerine veya

Bir kullanıcı kendi formunda bir öğe seçtiğinde, yalnızca username yerine get_full_name() görüntülerini görebilmelerini isterim.

class Books(models.Model): 
    author = models.ForeignKey(User) 
+3

Model sınıfınızı her zaman tekil olarak adlandırın, "Kitaplar" yerine "Kitap" yazın. –

+0

[Django formlarının olası bir kopyası: ModelChoiceField etiketlerini dinamik olarak oluşturma] (http://stackoverflow.com/questions/2958792/django-forms-how-to-dynamically-create-modelchoicefield-labels) –

cevap

32

Bu, çeşitli yollarla yapılabilir.

User numaralı proxy alt sınıfını oluşturun ve kullanıcının tam adını döndürmek için __unicode__() yöntemini geçersiz kılın. Modeliniz şeklinde Şimdi

class UserFullName(User): 
    class Meta: 
     proxy = True 

    def __unicode__(self): 
     return self.get_full_name() 

, kullanıcıların almak için UserFullName kullanın.

class BookForm(forms.ModelForm): 
    author = forms.ModelChoiceField(queryset=UserFullName.objects.all()) 
    class Meta: 
     model = Book 

bir başka yolu dinamik olarak formun yapıcı seçimler doldurmak etmektir.

class BookForm(forms.ModelForm): 

    def __init__(self, *args, **kwargs): 
     super(BookForm, self).__init__(*args, **kwargs) 
     users = User.objects.all() 
     self.fields['author'].choices = [(user.pk, user.get_full_name()) for user in users] 

    class Meta: 
     model = Book 

Belki en "djangonic" yollu benzer soru Django forms: how to dynamically create ModelChoiceField labels bir cevap olarak lazerscience ile ortaya konmuştur. ModelChoiceField'un alt sınıflarını alır ve seçim etiketleri sağlamak için tasarlanmış olan label_from_instance() yöntemini geçersiz kılar. böylece varsayılan yardım metni ('kontrol veya komutunu kullanın birden seçmek için

class UserFullnameMultipleChoiceField(ModelMultipleChoiceField): 
    def label_from_instance(self, obj): 
     return smart_unicode(obj.get_full_name()) 

class BookForm(forms.ModelForm): 
    authors = UserFullnameMultipleChoiceField(queryset=User.objects.all(), 
               help_text=Book.authors.field.help_text) 

Not I kopya help_text var:

Török Gábor cevabı ek olarak
class UserFullnameChoiceField(forms.ModelChoiceField): 
    def label_from_instance(self, obj): 
     return smart_unicode(obj.get_full_name()) 

class BookForm(forms.ModelForm): 
    author = UserFullnameChoiceField(queryset=User.objects.all()) 

    class Meta: 
     model = Book 
+0

Teşekkürler, son seçenek (çoğu "djangonic" yol) en temiz ve iyi görünüyor. Bir django.utils.encoding import smart_unicode öğesinden bir şey unutma. – SaeX

+0

Bu cevap için teşekkürler, sorunu çözmeme yardımcı oluyorsunuz –

0

aşağıdaki ModelMultipleChoiceField s için kullanılabilir ... ').

İlgili konular