2014-04-08 22 views
6

Tôi đang nghiên cứu Flask-Admin kết hợp với PeeWee Backend ModelView (nhưng câu hỏi của tôi cũng có thể được áp dụng cho SQLAlchemy backend), và có hai điều tôi không thể tìm thấy trong tài liệu hoặc ví dụ:Flask-Admin ModelView xác thực tùy chỉnh?

(1). Khi tôi mô hình của tôi có một trường duy nhất và tôi kiểm tra/cố gắng sao chép nó, tôi nhận được một màn hình lỗi Flask mặc định, với thông báo: "IntegrityError: tên người dùng cột không phải là duy nhất"

Tôi đang thử nghiệm ví dụ PeeWee trong https://github.com/mrjoes/flask-admin/blob/master/examples/peewee/simple.py và tôi đã thay đổi dòng 21 thành "username = peewee.CharField (max_length = 80, unique = True)"

Sau đó, tôi cố thêm hai người dùng bằng "username" = "user1".

Có cách nào lịch sự để quay lại màn hình chỉnh sửa (hoặc thậm chí màn hình danh sách, màn hình quản trị viên sẽ thực hiện) nhưng với thông báo lỗi được kiểm soát? Tôi không cần một thông báo lỗi tùy chỉnh, thông báo hiện tại là ok (IntegrityError: tên người dùng cột không phải là duy nhất). Nhưng tôi không phải màn hình sụp đổ.

Tôi có thể thiết lập/sử dụng trang mặc định của Flask 500, nhưng sau đó tôi sẽ thoát hoàn toàn dòng Flask-Admin và người dùng sẽ "bỏ lỡ" dữ liệu mà anh vừa nhập.

Tôi muốn quay lại màn hình chỉnh sửa nhưng có một số loại thông báo cảnh báo/lỗi. Tôi không ngại phải mở rộng các mẫu, đây không phải là vấn đề. Nhưng tôi không thể tìm thấy một nơi để ngăn chặn các lỗi và xử lý nó đúng cách. Bất kỳ đề xuất?

và (2):

Tôi cũng cần một cách để thêm một số xác thực lưu trước trong luồng. Ví dụ, tôi đang ở trong một hình thức chỉnh sửa của một thực thể có initial_date và final_date, và tôi muốn đảm bảo final_date lớn hơn initial_date hoặc là null, trước khi lưu.

Tôi có thể thực hiện phía máy khách này, thông qua javascript, mở rộng mẫu chỉnh sửa cho thực thể đó và thêm tập lệnh xác thực của tôi vào khối đuôi (và chặn sự kiện form.submit).

Nhưng điều gì sẽ xảy ra nếu xác thực của tôi yêu cầu xác thực phút cuối máy chủ? Có cách nào/nơi để chặn luồng và thêm xác nhận của tôi, và với may mắn, hãy trả lại thông báo lỗi của tôi, trong cùng một thời trang được thảo luận trong câu hỏi 1?

cảm ơn trước,

regards,

+0

Lý do tại sao sự cố - Flask-Admin sẽ truy cập lại tất cả các ngoại lệ (ngay cả IntegrityError) khi Flask đang chạy trong chế độ gỡ lỗi. Tôi sẽ thêm xử lý IntegrityError như một ngoại lệ cho quy tắc này. lưu trước có thể được thực hiện dưới dạng hoặc trong 'on_model_change' - bạn có thể ném ngoại lệ từ đó. Trong khi ngoại lệ sẽ được hiển thị với trình gỡ lỗi Werkzeug, trong chế độ sản xuất bạn sẽ thấy thông báo lỗi đẹp. – Joes

+0

@Joes 'on_model_change' là một móc hậu lưu như được ghi trong tài liệu": "Thực hiện một số hành động ** sau ** mô hình được tạo hoặc cập nhật." Không có móc lưu trước trong Flask admin AFAIK. lớp form cơ sở và tùy biến trong lớp con là cách duy nhất để trả lời câu hỏi của OP – Devy

+0

@Devy 'on_model_change' được gọi khi mô hình được cập nhật với dữ liệu biểu mẫu, nhưng trước khi phiên được cam kết với cơ sở dữ liệu. – Joes

Trả lời

11

Tôi đoán tôi đã tìm thấy một số điều mà giúp đỡ, nhưng không completelly trả lời câu hỏi của tôi.

tôi đã đăng một ví dụ trên Pastebin: http://pastebin.com/siwiaJAw

đầu tiên, tôi không thể tìm thấy một 'trước khi lưu' bước, nhưng tôi đã tìm thấy làm thế nào để thêm xác nhận tùy chỉnh lĩnh vực cấp, giúp trong trường hợp tạo và cập nhật.

Nếu bạn kiểm tra ví dụ này, bạn sẽ thấy dòng 37-39 và 42-44, nơi tôi nói thêm:

def no_root_allowed(form, field): 
    if field.data == 'root': 
     raise ValidationError('"root" is not allowed') 

form_args = dict(
    username=dict(validators=[no_root_allowed]) 
) 

validator này nhận 'hình thức' và 'lĩnh vực' và vì vậy tôi có thể làm kiểm chứng thực rằng liên quan đến nhiều hơn một lĩnh vực (như ngày bắt đầu < ngày kết thúc), và tôi thậm chí có thể truy cập vào các lớp Model để kiểm tra trùng lặp id, ví dụ.

Vì vậy, điều này giải quyết việc xác thực tạo/chỉnh sửa. Nếu trình xác thực không thành công, Flask-Admin sẽ đưa tôi trở lại biểu mẫu chỉnh sửa, đã được điền. Tốt đẹp!

Nhưng có vấn đề với việc xóa. Nếu tôi không muốn một đối tượng cụ thể bị xóa, tôi có thể gắn cờ nó là can_delete = False, nhưng điều đó sẽ ngăn chặn bất kỳ cá thể nào bị xóa.

Điều tốt nhất tôi có thể tìm thấy là chặn phương thức delete_model (dòng 55) và trả về False trong trường hợp lỗi xác thực trước khi xóa. Nhưng điều đó sẽ không đưa ra bất kỳ thông điệp nào, và sẽ chỉ đưa tôi trở lại biểu mẫu. Tôi không thể tìm thấy cách nào để gửi một tin nhắn cho người dùng rằng anh ta không thể xóa được cá thể cụ thể đó.

Tôi sẽ tiếp tục nghiên cứu và sẽ đăng thêm bất kỳ tin tức nào.

cảm ơn!

+0

Cảm ơn TON đã đăng bài này.Đã lưu cho tôi rất nhiều thời gian để đào bới – Chrispy

+0

bạn có biết liệu trình kiểm tra tùy chỉnh có thể cho biết liệu nó đang cập nhật mô hình hiện tại hay tạo mô hình mới? Thuộc tính is_created? – Chrispy

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