2009-06-02 34 views
6

Tôi đoán điều này sẽ liên quan đến regexp hoặc một cái gì đó, nhưng tôi sẽ cho nó một shot. Vào phút, người dùng có thể phá vỡ một trang web bằng cách nhập một cái gì đó tương tự như £$(*£$(£@$&£($ vào trường tiêu đề, được chuyển đổi thành một con sên bằng cách sử dụng Django slugify.Xác nhận một con sên ở Django

Vì không thể chuyển đổi các ký tự này, Django sẽ trả về lỗi. Câu hỏi của tôi là, tôi nên đặt gì vào phương thức xác thực biểu mẫu để nâng cao forms.ValidationError khi người dùng sử dụng tiêu đề như thế này?

Cảm ơn.

Trả lời

10

Câu hỏi này đã được nửa thập kỷ cũ nên khi cập nhật câu hỏi của mình, tôi nên giải thích rằng tôi ít nhất gật đầu trước đây, nơi một số tính năng có thể chưa tồn tại.

Cách dễ nhất để xử lý sên trong các biểu mẫu những ngày này là chỉ sử dụng django.models.SlugField. Nó sẽ xác nhận chính nó cho bạn và ngụ ý rằng trường này là một chỉ mục.

Nếu bạn không sử dụng này trên một mô hình, bạn vẫn có thể treo trong validator tương tự mà SlugField sử dụng:

from django.core.validators import validate_slug 

slug = forms.CharField(..., validators=[validate_slug]) 

Nếu bạn chỉ muốn làm đằng sau hậu trường kiểm tra hoặc viết riêng của bạn validator, bạn có thể sử dụng một kỹ thuật tương tự để kéo định nghĩa của Django về một slug hợp lệ. Nó chỉ là regex biên soạn mà validate_slug trên sử dụng:

from django.core.validators import slug_re 

if slug_re.match(...): 
    ... 

Tôi không thể tưởng tượng nó sẽ thay đổi, nhưng bằng cách khóa mình để ý tưởng của một con sên của Django, bạn sẽ đảm bảo tính nhất quán nếu Django làm thay đổi một ngày.

+2

Dường như hoạt động. Cảm ơn nhiều bạn. Trong phương thức clean_field: nếu re.match ("[a-zA-Z0-9] +", potential_slug) == Không: tăng biểu mẫu.ValidationError ("Tiêu đề không phải là chậm chạp") – user116170

+0

Regex này không ' t tài khoản cho việc sử dụng VERY COMMON của dấu gạch ngang "-" trong sên. Ngoài ra, \ d là thừa vì \ w cũng bao gồm các chữ số. Câu trả lời của Ben dưới đây là chính xác hơn. – Humphrey

+0

Câu trả lời của Ben dưới đây là chính xác hơn. [a-zA-Z0-9] + không khớp với dấu gạch dưới và dấu gạch ngang, [\ w \ d] + khớp với dấu gạch dưới chứ không phải dấu gạch nối. –

12
SLUG_REGEX = re.compile('^[-\w]+$') 
+1

Tôi tin rằng regex này tốt hơn so với Oli bởi vì nó cho phép sên của bạn chứa "-". – Humphrey

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