2011-07-26 31 views

Trả lời

44

Vâng, nếu bạn muốn nó chỉ có hiệu lực trong quản trị, chứ không phải trên toàn cầu, sau đó bạn có thể tạo một lớp con tùy chỉnh ModelChoiceField, sử dụng trong một tùy chỉnh ModelForm và sau đó thiết lập các lớp quản trị có liên quan đến sử dụng biểu mẫu tùy chỉnh của bạn. Lấy một ví dụ trong đó có FK để mô hình được sử dụng bởi Person @Enrique:

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 điều nữa: tại sao biểu tượng PLUS không được hiển thị bên cạnh đầu vào đã chọn của tôi? Các trường không ghi đè có trường - trường tôi đã thay đổi - KHÔNG phải – robos85

8

Xem 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) 

bạn phải xác định những gì bạn muốn hiển thị trong unicode phương pháp mô hình của bạn (nơi là ForeignKey).

Kính trọng,

+1

Tôi biết điều đó, nhưng tôi muốn thay đổi điều đó trong CHỈ 1 nơi trên quản trị ở nơi khác nó không nên thay đổi làm phương pháp đó không tốt cho tôi. – robos85

+0

@ robos85: Kiểm tra câu trả lời của tôi cho những gì bạn đang tìm kiếm. Bạn cũng nên cập nhật câu hỏi của mình. –

35

Một cách khác để làm như vậy (hữu dụng khi bạn thay đổi queryset của bạn):

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) 

'user' là tên của trường bạn muốn ghi đè. Giải pháp này cung cấp cho bạn một lợi thế: bạn cũng có thể ghi đè truy vấn (ví dụ: bạn muốn User.objects.filter (username__startswith = 'a'))

Tuyên bố từ chối: giải pháp được tìm thấy trên http://markmail.org/message/t6lp7iqnpzvlt6qp và thử nghiệm.

9

các phiên bản mới hơn của django hỗ trợ này, có thể được dịch với gettext:

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

Tài liệu tại https://docs.djangoproject.com/en/dev/topics/db/models/#verbose-field-names. – jarmod

+5

điều này thực sự giải quyết một vấn đề khác với người đang được hỏi. –

0

Tôi chỉ thấy rằng bạn có thể thay thế queryset với queryset khác, hoặc thậm chí loại bỏ các queryset và thay thế bằng một danh sách lựa chọn . Tôi làm điều này trong change_view.

Trong ví dụ này, tôi để cho phụ huynh thiết lập giá trị trả về, sau đó lấy các lĩnh vực cụ thể từ nó và thiết lập .choices:

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 
1

Một thay thế cho câu trả lời đầu tiên:

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) 
Các vấn đề liên quan