2011-11-30 24 views
8

Tôi có mẫu đơn này:Hidden lĩnh vực ở dạng Django không cleaned_data

class CollaboratorForm(forms.Form): 
    user = forms.CharField(label="Username",max_length=100) 
    canvas = forms.IntegerField(widget=forms.HiddenInput) 
    .... 
    def clean_user(self): 
     user = self.cleaned_data['user'] 
     canvas = self.cleaned_data['canvas'] 

Trong giao diện Tôi chỉ đơn giản là gọi

if form.is_valid(): 

tôi nhận được lỗi:

KeyError at /canvas/1/add-collaborator/ 
'canvas' 

Theo firebug giá trị được đăng, nó chỉ có vẻ không được làm cho nó vào chức năng sạch của tôi. Tôi có làm sai không?

EDIT: Đăng dữ liệu

canvas 1 
csrfmiddlewaretoken 2cb73be791b32ca9a41566082c804312 
user username 

EDIT2: Tôi cũng sẽ sẵn sàng chấp nhận một câu trả lời có thể cho tôi biết làm thế nào để gửi chìa khóa chính để chức năng clean_user, nơi mà các khóa chính là/1/trong url mẫu ở trên. Các chức năng trong giao diện được gọi là:

def canvas_add_collaborator(request, pk): 

Vì vậy, tôi muốn gửi pk đến chức năng clean_user mà sẽ giải quyết vấn đề của tôi bằng cách không cần các trường ẩn.

+0

bạn có thể thêm nội dung của bài đăng http của mình không? –

+0

về EDIT2. Bạn có thể chuyển pk sang hàm clean_user. 'clean_user (self, pk)' –

Trả lời

9

Bạn cần thay đổi tên phương thức thành clean(), not clean_user(). 'canvas' không có trong clean_data nếu bạn vừa xác thực trường người dùng.

+0

Tôi không biết làm thế nào mà không nhấp vào, nó làm cho cảm giác hoàn hảo. Cảm ơn. – Samsquanch

+0

Có thể có phương thức clean() hoạt động không? – Erwan

0

tôi giải quyết vấn đề của tôi (có lẽ không phải là cách tốt nhất, nhưng hoạt động) sử dụng này:

class CollaboratorForm(forms.Form): 
    .... 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop('canvas', None) 
     super(CollaboratorForm, self).__init__(*args, **kwargs) 

Sau đó, trong quan điểm của tôi:

def canvas_add_collaborator(request, pk): 
    .... 
    form.canvas = pk 

Có lẽ không phải là giải pháp thanh lịch nhất, nhưng nó hoạt động cho bây giờ. Phản hồi chào mừng.

+1

Nhìn vào câu trả lời của tôi. Bạn cần đổi tên chức năng sạch của mình. –

0

Tôi thấy rằng thứ tự trong khai báo các trường quan trọng, vì vậy nếu bạn muốn truy cập clean_data ['canvas'] trong phương thức clean_user, bạn phải khai báo canvas đầu tiên trong các trường của bạn. Tôi đã thử nghiệm điều này ở dạng Mẫu