2012-04-07 19 views
29

Như tôi hiểu, bạn nên luôn sử dụng TextField cho chuỗi có độ dài thay đổi khi sử dụng cơ sở dữ liệu PostgreSQL vì chênh lệch tốc độ giữa TextFieldCharField không đáng kể với PostgreSQL. Tôi liên tưởng mới với Django, và đang cân nhắc việc sử dụng một số TextField cho các url có độ dài thay đổi trong cơ sở dữ liệu của tôi. Tôi đã tự hỏi nếu có bất kỳ lợi thế để sử dụng URLField? Nó có được coi là biểu mẫu không hợp lệ để sử dụng số TextField thay vì một số URLField cho các url không?Ưu điểm khi sử dụng URLField trên TextField?

Trả lời

43

URLField thực sự là CharField w/hỗ trợ của biểu thức chính quy dựa trên URL kiểm tra mẫu và một validator trực tuyến (được thay thế bằng một validator dựa RegEx), bạn có thể sử dụng TextField nếu bạn không quan tâm chiều dài-hạn chế của URL

from django.core.validators import URLValidator 

# in model 
field = models.TextField(validators=[URLValidator()]) 

Hơn nữa, việc sử dụng CharField hoặc TextField tùy thuộc vào việc bạn có muốn giới hạn độ dài tối đa trên trường hay không và loại phần tử nào phù hợp hơn để chỉnh sửa: văn bản hoặc đầu vào. Về phía PostgreSQL, không có sự khác biệt đáng kể.

+8

Đối với hồ sơ, [IE không thể tải các URL dài hơn khoảng 2.000 chars] (https://stackoverflow.com/questions/417142/what-is-the- tối đa chiều dài của một trình duyệt khác nhau), vì vậy bạn chỉ có thể đặt 'max_length' thành 2000 trên' URLField' và gọi nó là một ngày. – mlissner

+0

Bất kỳ tham chiếu nào đến việc không dùng URLField? – pravin

+0

@pravin Đây không phải là URLField nhưng trình xác thực trước đó của nó không còn được dùng nữa. Trình xác thực đã truy cập vào URL trực tuyến để xác minh, bây giờ nó được thay thế bằng trình xác thực regex để kiểm tra tính hợp lệ của định dạng URL. – okm

2

https://docs.djangoproject.com/en/dev/ref/models/fields/#urlfield Tất nhiên bạn có thể sử dụng CharField/TextField nhưng xử lý thông tin nhập của người dùng và đảm bảo mọi người dùng nhập vào tùy bạn.

Từ mã nguồn:

# Như với CharField, điều này sẽ gây ra xác nhận URL được thực hiện

Nếu bạn thấy URLField source code bạn sẽ thấy nó thực sự là một CharField với URL validator.

Ngoài ra còn có sẵn sàng sử dụng các trường khác như EmailField, ImageField, * Field!

2

Hãy thử lớp này:

class LongURLField(TextField): 
    description = 'Long URL' 

    def __init__(self, verbose_name=None, name=None, **kwargs): 
     TextField.__init__(self, verbose_name, name, **kwargs) 
     self.validators.append(validators.URLValidator()) 

    def formfield(self, **kwargs): 
     # As with TextField, this will cause URL validation to be performed 
     # twice. 
     defaults = { 
      'form_class': forms.URLField, 
     } 
     defaults.update(kwargs) 
     return super(LongURLField, self).formfield(**defaults) 
+1

đặt max_length thành 2000 và bạn có trường hoàn hảo :) – gabn88

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