2012-03-13 39 views
5

Theo hướng dẫn của Django, bạn nên truy cập các trường biểu mẫu bằng cách sử dụng từ điển clean_data. Tôi tự hỏi tại sao tôi không thể truy cập trực tiếp các thuộc tính của biểu mẫu? Hình thức của tôi xác nhận tốt, nhưng khi tôi cố gắng truy cập nó, Django phàn nàn rằng đối tượng không có thuộc tính. Tôi đã thêm một số mã bên dưới mà tôi hy vọng sẽ giúp chẩn đoán sự cố.Truy cập các trường biểu mẫu dưới dạng thuộc tính ở chế độ xem django

Mẫu:

class CustomForm(forms.Form): 
    description = forms.CharField(widget = forms.TextInput(attrs = {'placeholder' : 'enter some text'}), label = "My form") 

Xem:

def process_form(request): 
    if request.method != 'POST': 
     raise Http404 

    myForm = CustomForm(request.POST) 

    if not myForm.is_valid(): 
     c = RequestContext(request) 
     return render_to_response('home/index.html', {'form' : myForm }, c) 

    # debug 
    print 'Description: ' + myForm.description # this does NOT work 
    # print 'Description: ' + myForm.cleaned_data['description'] # this does work 

tôi nhận được lỗi sau: đối tượng 'CustomForm' không có thuộc tính 'description'. Tôi đã bỏ lỡ điều gì đó trong tài liệu nói rằng tôi không thể làm điều đó?

Trả lời

10

Cách bạn xác định trường bằng cách sử dụng django.forms chỉ là một tiện ích, cú pháp rõ ràng; nó không thực sự đại diện cho những gì lớp Form cuối cùng, hoặc một thể hiện của nó, trông giống như về các thuộc tính.

Forms có một metaclass (mà không nhận được quá sâu vào nó, một metaclass là để khai báo một lớp bằng cách sử dụng từ khóa class như một phương pháp __init__ là để tạo ra một thể hiện của một lớp học sử dụng dấu ngoặc đơn - một cái móc để tùy chỉnh các đối tượng là tạo ra, trong trường hợp của một metaclass, là một class!) mà chọn ra các lĩnh vực từ các hình thức lớp học tại thời gian định nghĩa và thêm chúng vào một base_fields dict. Khi bạn tạo biểu mẫu, số base_fields được sao chép sâu thành thuộc tính fields trên cá thể.

Một điểm gây nhầm lẫn có thể là bạn sử dụng . để truy cập các trường để hiển thị trong mẫu - điều thực sự xảy ra là công cụ mẫu của Django đầu tiên cố gắng sử dụng truy cập thuộc tính kiểu từ [] để phân giải tra cứu thuộc tính và lớp biểu mẫu cơ sở định nghĩa phương thức __getitem__ để tận dụng điều này, tìm kiếm trường thích hợp từ hình thức fields dict của trường hợp mẫu và gói nó bằng BoundField, trình bao bọc biết cách sử dụng trường và dữ liệu từ biểu mẫu để hiển thị trường.

15

Nếu mẫu của bạn được xác nhận sau đó bạn có thể truy cập myForm cleaned_data:

print myForm.cleaned_data.get('description') 

Nếu bạn muốn xem lý do tại sao bạn không thể truy cập myForm.description sau đó bạn sẽ nhìn thấy dữ liệu từ điển của myForm của bạn:

print myForm.__dict__ 
+0

Tôi hiểu rằng tôi có thể truy cập nó bằng cách sử cleaned_data. Những gì tôi không hiểu là lý do tại sao tôi không thể truy cập nó bằng cách sử dụng chính nó: myForm.description. Chính xác điều gì xảy ra dưới mui xe khiến tôi không thể truy cập vào nó? –

3

Bạn có thể truy cập trought trường của mình dict.

form.__dict__["fields"]["description"] 
3

Bạn có thể truy cập các trường của thể hiện Biểu mẫu từ thuộc tính trường.

myForm.fields['description'] 

Và một số tài sản như nhãn có thể được truy cập như thế này:

myForm.fields['description'].label 

Không chắc làm thế nào để hiển thị giá trị tương ứng. Bất kỳ ai có ý tưởng?

đây là tài liệu tham khảo của tôi

https://docs.djangoproject.com/en/dev/ref/forms/api/#accessing-the-fields-from-the-form

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