2012-02-29 35 views
5

Có cách nào, hy vọng không có quyền quản trị, để vô hiệu hóa chỉnh sửa các phiên bản mô hình hiện có trên cấp ORM không?Django - vô hiệu hóa chỉnh sửa mô hình

Tôi không nói về việc xóa các nút 'Lưu' và 'Lưu và tiếp tục' khỏi các mẫu - không nên có các thao tác có thể thay đổi giá trị của một cá thể đã cam kết của một mô hình.

Tốt hơn là tùy chọn 'Lưu dưới dạng' sẽ hoạt động thay thế.

Trả lời

8

Ghi đè lên các chức năng tiết kiệm cho mô hình của bạn như sau:

 
class MyModel(models.Model): 

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

     if self.pk is None: 
      super(MyModel, self).save(*args, **kwargs) 

Chức năng này chỉ gọi cha lưu chức năng (mà thực sự tiết kiệm thay đổi) nếu không có pk, ví dụ ví dụ mẫu là mới.

+3

Điều tôi không thích về phương pháp này là sau khi nhấp vào lưu, vẫn có thông báo "The ... đã được thay đổi thành công.", không có gì thay đổi. Có cách nào để thay đổi thông báo này thành "Thay đổi bị vô hiệu hóa" không? Hoặc thậm chí tốt hơn, để vô hiệu hóa nhấp vào hàng đó? – WebOrCode

+3

Có cách nào để ngăn chặn 'MyModel.objects.filter (pk = my_model.pk) .update (name =" bob ")' –

4

Bạn có thể ghi đè tiết kiệm lớp mô hình của bạn() (không làm gì cả nếu self.pk) và xóa (luôn luôn không làm gì cả)

Nhưng thực sự, mức cơ sở dữ liệu là nơi an toàn nhất cho điều đó. Ví dụ: trong PostgreSQL, bạn có thể viết hai quy tắc đơn giản:

CREATE RULE noupd_myapp_mymodel AS ON UPDATE TO myapp_mymodel 
    DO NOTHING; 
CREATE RULE nodel_myapp_mymodel AS ON DELETE TO myapp_mymodel 
    DO NOTHING; 

Dù bằng cách nào, quản trị viên sẽ không biết gì về điều này, vì vậy mọi thứ vẫn có thể chỉnh sửa được. Xem câu trả lời của tôi cho Whole model as read-only để tìm cách tạo mô hình chỉ đọc trong quản trị viên. Cho các mục đích của bạn, hãy giữ quyền thêm như là, và chỉ khai báo tất cả các trường chỉ đọc khi không thêm.

EDIT: Một lý do tại sao việc ghi đè xóa() trong lớp mô hình của bạn không an toàn, thực tế là "xóa hàng loạt" (Queryset.delete(), ví dụ như hành động hộp kiểm của quản trị viên) sẽ không gọi cho từng trường hợp 'xóa (), nó sẽ đi thẳng đến SQL: https://docs.djangoproject.com/en/dev/topics/db/queries/#deleting-objects

+0

Cảm ơn bạn đã trả lời câu hỏi này. Tôi đang cố gắng tìm ra cách để vượt qua các quy tắc này trên models.py. Phần liên quan nhất của tài liệu tôi tìm thấy là [Thực thi SQL tùy chỉnh trực tiếp] (https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly). Bạn có thể đưa ra một ví dụ đơn giản để minh họa cách tiếp cận này? – raratiru

+1

Các chỉ số SQL ở trên chỉ được thực hiện một lần, theo bất kỳ cách nào bạn muốn. Một khi quy tắc là trong Postgres nó sẽ được tôn trọng. Vì vậy, bạn có thể sử dụng psql để làm điều này. Nếu bạn sử dụng miền Nam để di chuyển mô hình, tôi sẽ khuyên bạn nên di chuyển tùy chỉnh mà db.execute() các quy tắc. Xem ví dụ câu trả lời http://stackoverflow.com/a/5466251/640759 –

Các vấn đề liên quan