2009-03-17 24 views
18

Tôi đang thêm xác thực tùy chỉnh vào biểu mẫu và trường tùy chỉnh trong ứng dụng Django của mình. Tôi muốn có thể sửa đổi giá trị của trường khi kích hoạt lỗi. Ví dụ: nếu có lỗi, biểu mẫu sẽ được hiển thị lại với giá trị trường được sửa bởi clean() và thông báo lỗi "Dữ liệu đã được sửa chữa bên dưới. Nhấp vào lưu lại để xác nhận xem những thay đổi này có được"Sửa đổi giá trị của trường biểu mẫu Django trong suốt()

I đã thử trả về dữ liệu đã sửa đổi trong clean_data [] như thế này nhưng nó không hoạt động. Nó hiển thị lỗi chính xác, nhưng giá trị trường không được cập nhật với HTML đã sửa khi biểu mẫu được hiển thị lại.

class T34AtividadeForm(ModelForm): 
    def clean(self): 
     # Return cleaned html 
     error,html = fix_imgs(cleaned_data.get("a34_descricao")) 
     if error: 
      msg = u'Data has been corrected below. Click save again to confirm if these changes are OK'; 
      self._errors['a34_descricao'] = ErrorList([msg]) 
      # This doesn't work 
      cleaned_data["a34_descricao"] = html 
      # This doesn't work either 
      self.a34_descricao = html 

    return cleaned_data 

Tôi cũng muốn làm điều tương tự với trường, nhưng do lỗi được kích hoạt bởi ngoại lệ, tôi không có cơ hội trả về giá trị đã sửa. Giống như phương thức clean() của form, lỗi được hiển thị đúng, nhưng giá trị không được cập nhật.

class HTMLField(CharField): 
    widget = HTMLTextarea 

    def clean(self, value): 
     value = super(HTMLField,self).clean(value) 
     error,html = fix_imgs(value) 
     if error: 
      # This doesn't work 
      self.value = html 
      raise forms.ValidationError(u'Data has been corrected below. Click save again to confirm if these changes are OK.') 
     return html 

Trả lời

6

thay đổi tự dữ liệu trong phương pháp sạch để thay đổi giá trị đó được hiển thị

+6

Tác phẩm này, nhưng không có giấy tờ và cảm thấy xấu xí khi sửa đổi đối tượng QueryDict trực tiếp. Ngoài ra, tôi đã phải viết một hàm trợ giúp để sửa đổi QueryDict chỉ đọc .... – user27478

+1

Có quyền nhưng có afaik không có cách chính thức để làm điều này. – user51463

+3

@ user27478: Bạn có thể đăng giải pháp của mình không? – Don

-1

Nếu mẫu của bạn là một mô hình tạo thành một cách tiếp cận tốt hơn sẽ là để có được một thể hiện và sửa dữ liệu thay vì:

inst = my_form.save(commit=False) 
if inst.a34_stuff is None: #or incorrect 
    inst.a34_stuff = "corrected" 
    request.user.message_set.create(message = "Error corrected") 
    return HttpResponseRedirect(reverse('your_url_name', 
      args=[]) 

PS: Tôi không chắc chắn nếu điều này thực sự sẽ hoạt động ... Không chắc chắn nếu biểu mẫu sẽ đón thay đổi.

+0

Không hoạt động! – digz6666

0

Đây là cách tôi đã cố gắng và làm việc cho tôi:

inst = my_form.save(commit=False) 
if not inst.a34_stuff: # or incorrect 
    inst.data["a34_stuff"] = "corrected" 
+1

Nếu có lỗi xác thực, nó không hoạt động! – digz6666

3

Way để cập nhật giá trị trong sạch() là cập nhật các giá trị trong từ điển dữ liệu mẫu của:

self.data["a34_stuff"] = "html" 

tác phẩm này chắc chắn.

+1

Tính năng này không hoạt động với Django 2.0 – Daniel

+0

cũng không hoạt động ở 1.11! –

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