2013-07-30 31 views
53

Tôi có một mô hình được đăng ký trong trang quản trị. Một trong các trường của nó là một biểu thức chuỗi dài. Tôi muốn thêm các trường biểu mẫu tùy chỉnh vào trang thêm/cập nhật của mô hình này trong quản trị dựa trên các giá trị trường này, tôi sẽ xây dựng biểu thức chuỗi dài và lưu nó trong trường mô hình có liên quan.quản trị viên django - thêm các trường biểu mẫu tùy chỉnh không phải là một phần của mô hình

Tôi có thể làm như thế nào? Về cơ bản những gì tôi đang làm là xây dựng một biểu thức toán học hoặc chuỗi từ ký hiệu, người dùng chọn biểu tượng (đây là các trường tùy chỉnh không phải là một phần của mô hình) và khi nhấp chuột lưu, sau đó tôi tạo biểu diễn chuỗi biểu diễn từ danh sách các biểu tượng và lưu trữ nó trong DB. Tôi không muốn các biểu tượng là một phần của mô hình và DB, chỉ là biểu thức cuối cùng.

Trả lời

20

Nó có thể làm trong quản trị viên, nhưng không phải là một cách rất đơn giản với nó. Ngoài ra, tôi muốn lời khuyên để giữ cho hầu hết các logic kinh doanh trong các mô hình của bạn, vì vậy bạn sẽ không phụ thuộc vào Admin Django.

Có thể sẽ dễ dàng hơn (và thậm chí có thể tốt hơn) nếu bạn có hai trường riêng biệt trên mô hình của mình. Sau đó, thêm một phương thức trên mô hình kết hợp chúng.

Ví dụ:

class MyModel(models.model): 

    field1 = models.CharField(max_length=10) 
    field2 = models.CharField(max_length=10) 

    def combined_fields(self): 
     return '{} {}'.format(self.field1, self.field2) 

Sau đó, trong quản trị bạn có thể thêm combined_fields() như một lĩnh vực readonly:

class MyModelAdmin(models.ModelAdmin): 

    list_display = ('field1', 'field2', 'combined_fields') 
    readonly_fields = ('combined_fields',) 

    def combined_fields(self, obj): 
     return obj.combined_fields() 

Nếu bạn muốn lưu trữ các combined_fields trong cơ sở dữ liệu bạn cũng có thể lưu nó khi bạn lưu mô hình:

def save(self, *args, **kwargs): 
    self.field3 = self.combined_fields() 
    super(MyModel, self).save(*args, **kwargs) 
+2

Cảm ơn cho câu trả lời, nhưng điều này không phải là điều tôi tìm kiếm. Tôi không muốn các trường tùy chỉnh được lưu trong DB, chỉ chuỗi được tính toán. Về cơ bản những gì tôi đang làm là xây dựng biểu thức toán học hoặc chuỗi từ ký hiệu, người dùng chọn biểu tượng (đây là các trường tùy chỉnh không phải là một phần của mô hình) và khi nhấp chuột lưu, tôi tạo biểu diễn chuỗi từ danh sách biểu tượng và lưu trữ nó trong DB. – michalv82

+0

@ michalv82 Bạn cũng có thể lưu nó vào cơ sở dữ liệu trong phương thức 'save()' của mô hình, kiểm tra các cập nhật của câu trả lời của tôi. – rednaw

+0

cảm ơn một lần nữa, nhưng vấn đề là tôi không muốn lưu trữ các lĩnh vực kết hợp lĩnh vực cuối cùng (tức là các biểu tượng), tôi chỉ muốn chuỗi cuối cùng được lưu – michalv82

3

Nếu bạn hoàn toàn onl y muốn để lưu trữ các lĩnh vực kết hợp trên mô hình và không phải là hai lĩnh vực riêng biệt, bạn có thể làm một cái gì đó như thế này:

tôi không bao giờ làm điều gì đó như thế này vì vậy tôi không hoàn toàn chắc chắn làm thế nào nó sẽ làm việc ra.

101

Hoặc trong admin.py của bạn hoặc trong một forms.py riêng biệt, bạn có thể thêm một lớp ModelForm và sau đó khai báo các trường bổ sung của bạn bên trong như bình thường. Tôi cũng đưa ra một ví dụ về cách bạn có thể sử dụng các giá trị trong form.save():

class YourModelForm(forms.ModelForm): 

    extra_field = forms.CharField() 

    def save(self, commit=True): 
     extra_field = self.cleaned_data.get('extra_field', None) 
     # ...do something with extra_field here... 
     return super(YourModelForm, self).save(commit=commit) 

    class Meta: 
     model = YourModel 

Để có trường bổ sung xuất hiện trong quản trị chỉ:

  1. chỉnh sửa quản trị của bạn.py và thiết lập thuộc tính hình thức để tham khảo các hình thức mà bạn đã tạo ở trên
  2. bao gồm các lĩnh vực mới của bạn trong các lĩnh vực hoặc fieldsets bạn khai

Như thế này:

class YourModelAdmin(admin.ModelAdmin): 

    form = YourModelForm 

    fieldsets = (
     (None, { 
      'fields': ('name', 'description', 'extra_field',), 
     }), 
    ) 

UPDATE: Trong django 1.8 bạn cần thêm fields = '__all__' vào metaclass của YourModelForm.

+4

Có lý do nào khiến câu trả lời này không được chấp nhận không? – sthzg

+2

Có, tôi thực sự muốn biết lý do – Vishnu

+8

Bạn nên thêm 'fields = '__all __'' vào lớp 'Meta' của bạn, nếu không django sẽ than phiền:' Tạo một ModelForm không có thuộc tính 'fields' hoặc thuộc tính 'exclude' bị phản đối ' – IsaacKleiner

4

bạn luôn có thể tạo ra mẫu quản trị mới, và làm những gì bạn cần trong admin_view của bạn (ghi đè lên các quản trị viên thêm url để admin_view của bạn):

url(r'^admin/mymodel/mymodel/add/$' , 'admin_views.add_my_special_model') 
Các vấn đề liên quan