2012-01-29 26 views
15

Có phải điển hình để tách xác thực đầu vào khỏi xác thực cấp mô hình trong các dự án Django không? Ví dụ: xác thực rằng tên người dùng phù hợp với tiêu chí đặt tên sẽ là xác thực nhập và xác minh rằng người dùng chưa có trong cơ sở dữ liệu sẽ là xác thực cấp mô hình.Tách đầu vào biểu mẫu và xác thực mô hình trong Django?

Tôi đã xem mã của đồng nghiệp và đặt cả hai loại xác thực trong một lớp biểu mẫu (trong forms.py). Đây có phải là thiết lập điển hình hay thông thường hơn để xác thực cấp mô hình xuất hiện trong mô hình hoặc chế độ xem?

Hoặc có cách nào tốt hơn để tiếp cận điều này-- chẳng hạn như sử dụng ModelForm? Tôi khá mới với Django và cố gắng tìm hiểu mô hình được đề xuất cho tình huống này là gì.

Trả lời

12

Đây là một câu hỏi rất thú vị (đối với tôi).

Theo ý kiến ​​của tôi, tất cả mã xác thực phải được chuyển sang mã mô hình. Đây là cách để không phá vỡ các quy tắc kinh doanh. Khi mã xác nhận nằm trong mô hình, bạn không thể quên một số xác nhận trong một biểu mẫu mới hoặc có các quy tắc không nhất quán trong một số biểu mẫu.

Tôi liên kết với bạn 'Django, Raise a validation error in a model's save method' câu hỏi có liên quan đến bạn. Dưới câu hỏi bạn có thể thấy cách di chuyển mã xác thực từ biểu mẫu sang kiểu. Tôi hy vọng rằng phần giới thiệu ngắn gọn này có thể giúp ích cho bạn.

Từ khung công tác bạn đến? Làm thế nào các quy tắc xác nhận được viết trong môi trường của bạn?

+3

Tôi đồng ý. Hầu hết mọi thứ thực sự có thể được coi là "xác thực cấp mô hình". Bạn thực sự không bao giờ muốn một tên người dùng nhấn vào cơ sở dữ liệu nếu nó không khớp với tiêu chí đặt tên. Có một số thứ sẽ thay đổi theo mẫu, và đó là nơi bạn muốn xác thực trên biểu mẫu. Bạn có thể có một mô hình Tệp ưa thích chứa loại tệp trong một trường. Bất kỳ loại nào cũng được chấp nhận ở cấp mô hình, nhưng trong mẫu tải lên ảnh bạn muốn giới hạn nó thành png và jpeg, chẳng hạn. – dokkaebi

8

Tôi không đồng ý với câu trả lời được chấp nhận. Tôi thích sử dụng xác thực cấp mô hình để tránh sự không thống nhất trong các mô hình và xác thực cấp biểu mẫu cho bất kỳ hạn chế trang web cụ thể nào.

Giả sử chúng tôi có mô hình cho các sự kiện, với các trường datetime cho thời gian bắt đầu và kết thúc. Việc xác nhận mẫu sẽ buộc chúng tôi phải có thời gian kết thúc sau thời gian bắt đầu. Tuy nhiên, tôi sẽ để nó trong biểu mẫu để xác thực rằng sự kiện mới được tạo ra không có trong quá khứ. Do đó, nếu tôi phải thêm một sự kiện xảy ra trong quá khứ, tôi có thể sử dụng biểu mẫu dành riêng cho quản trị viên cho phép các ngày trong quá khứ hoặc chỉ cần thêm trực tiếp vào cơ sở dữ liệu.

Do đó, xác thực mẫu chỉ nên kiểm tra các giá trị sai. nhưng nếu bạn cần phải làm điều gì đó sôi nổi (ví dụ: các ký tự Unicode trong tên người dùng cho bot), nó sẽ cho phép bạn làm điều đó, ngay cả khi nó chỉ thông qua quản trị viên hoặc trình bao. Tôi đã đọc một câu trả lời trên StackOverflow đề xuất luôn sử dụng biểu mẫu trong mã phụ trợ, điền vào các trường có mã như form["field"] = "value", để được hưởng lợi từ xác thực nhất quán.

+1

Đối với kịch bản ví dụ của bạn, bạn có thể có trường userId trên bảng 'sự kiện' và cho phép biểu mẫu điền với ngày trong quá khứ cho một số người dùng nhóm. Đối với mỗi ví dụ bạn đăng tôi có thể tìm thấy một counterexample như thế này;) Nhưng đây là cách tiếp cận của tôi, tôi chắc chắn hơn cho một số quy tắc, hình thức xác nhận sẽ là giải pháp tốt nhất. – danihp

+0

Tất nhiên bạn cũng có thể thực hiện nó trong mô hình, nhưng sau đó bạn đang nướng chức năng vào một cái gì đó mà phải là hình thức thay thế. Nếu bạn muốn tái sử dụng mô hình Blog của mình ở nơi khác, tại sao nó nên quan tâm nếu bài đăng thuộc về một người dùng trong một nhóm có tên là "quản trị"? Vì yêu cầu này có thể thay đổi từ trang này sang trang khác, tốt nhất là nên để một biểu mẫu thay vì chính mô hình đó. – sleblanc

+0

có lẽ, trong tương lai, ứng dụng web của bạn sẽ có api hoàn toàn còn lại. Chỉ là một ví dụ. Cảm ơn về chia sẻ commet của bạn, được chào đón. – danihp

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