2012-06-06 36 views
5

Tôi cần tạo lớp Biểu mẫu có thể có hoặc không có trường ReCaptcha tùy thuộc vào việc người dùng có đăng nhập hay không.Trường có điều kiện theo mẫu

Vì đây là CommentForm, tôi không có quyền truy cập vào đối tượng request về tạo/định nghĩa biểu mẫu, vì vậy tôi không thể dựa vào điều đó.

Đối với POST yêu cầu giải pháp là đơn giản: Tôi đã nhận điều này:

class ReCaptchaCommentForm(CommentForm): 
    def __init__(self, data=None, *args, **kwargs): 
     super(ReCaptchaCommentForm, self).__init__(data, *args, **kwargs) 
     if data and 'recaptcha_challenge_field' in data: 
      self.fields['captcha'] = ReCaptchaField() 

Sau khi làm điều này, hình thức xác nhận sẽ làm việc như dự định. Vấn đề bây giờ là ở phía bên mẫu. Tôi cần mẫu như sau:

<form action={% comment_form_target %} method="post"> 
{# usual form stuff #} 
{% if not user.is_authenticated %} 
<script type="text/javascript" 
     src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script> 
<div id="recaptcha-div"></div> 
<script type="text/javascript"> 
    Recaptcha.create({{ public_key }}, "recaptcha-div", 
        { theme: 'white', 
        callback: Recaptcha.focus_response_field }); 
</script> 
{% endif %} 
</form> 

Nhưng tôi không muốn lặp lại mã đó trên mọi mẫu comments/*/form.html. Tôi thu thập ở đó nên có một số cách để thêm mã tương đương từ phương thức render của tiện ích và định nghĩa Media.

Có ai có thể nghĩ ra một cách hay để làm điều này không?

+1

Vấn đề là các tiện ích không biết gì về yêu cầu, do đó không có cách nào để hiển thị theo điều kiện dựa trên người dùng đã đăng nhập. Mặc dù, bạn có thể muốn xem django-floppyforms. Vì nó sử dụng các khuôn mẫu để hiển thị các widget, có thể bạn có thể làm những gì bạn muốn theo cách đó. –

+0

vâng, đó là ý tưởng tôi có, hiển thị một tiện ích thông qua mẫu. Nhưng tôi không chắc rằng tôi có thể có request.user trong các khuôn mẫu mẫu của mình ngay cả khi tôi làm điều này (widget.render có thể làm bất cứ điều gì nó muốn, bao gồm việc dựng một khuôn mẫu, ngữ cảnh là vấn đề). Điều tôi muốn làm là hiển thị mẫu, sau đó sẽ được phân tích cú pháp trên – Lacrymology

+1

Đó là lý do tại sao tôi đề xuất django-floppyforms. Tôi không hoàn toàn chắc chắn, nhưng tôi nghĩ rằng nó hoạt động ra khỏi mô hình bao gồm tiêu chuẩn, thay vì chỉ đơn giản là có 'render' sử dụng một mẫu. Nó sẽ có quyền truy cập vào 'request' trong ngữ cảnh khuôn mẫu giống như bất kỳ mẫu nào khác được bao gồm.Hãy thử xem và xem. –

Trả lời

4

Tôi cho rằng bạn instatiate biểu mẫu trong xem, vì vậy bạn chỉ có thể vượt qua người dùng từ yêu cầu đến hình thức (giống như trong ứng dụng auth SetPassword mẫu):

def __init__(self, user, data=None, *args, **kwargs): 
    super(ReCaptchaCommentForm, self).__init__(data, *args, **kwargs) 
    if user.is_authenticated(): 
     self.fields['captcha'] = ReCaptchaField() 
+0

không, hệ thống bình luận không hoạt động như vậy (nó không phải là một khung nhìn, đó là một templatetag, và nó không vượt qua yêu cầu (OR người dùng) như một tham số.Đây là một phần của mô tả! – Lacrymology

0

Vâng, thật không may là các django-floppyforms không cấp quyền truy cập vào yêu cầu. Nó sẽ được tốt đẹp để biết nó là một lựa chọn, như tôi đã gần đây đã bắt đầu sử dụng django-floppyforms trong dự án của riêng tôi.

Tóm lại, điều tốt nhất tôi có thể nghĩ là chỉ cần dựa vào kế thừa mẫu. Bạn có thể tạo tệp comments/form.html và sau đó mỗi tệp comments/*/form.html mở rộng. Đặt mã Recaptcha như bạn có nó trong cơ sở form.html và bạn tốt để đi.

+0

đó là những gì tôi đã làm, nhưng tôi muốn một giải pháp đẹp hơn. Đặc biệt kể từ khi a) Tôi sẽ cần phải làm tương tự cho các biểu mẫu bên ngoài hệ thống nhận xét, và b) điều này sẽ là tầm thường – Lacrymology

+0

Vâng, nó loại * là * tầm thường. Bạn chỉ cần thêm tập lệnh vào mẫu cơ sở mà tất cả các biểu mẫu kế thừa từ đó. Và, nếu bạn cần nó bên ngoài hệ thống bình luận, không có gì nói rằng bạn không thể có một mẫu form.html cao hơn, có lẽ ngay trong thư mục mẫu chính, ứng dụng này và tất cả các ứng dụng khác cần nó kế thừa từ . –

3

Sử dụng crispy-forms! Bạn có thể bao gồm các phần tử html trong bố cục biểu mẫu cho phép bạn loại trừ/bao gồm một trường dựa trên ngữ cảnh yêu cầu lượt xem. Tính năng cực kỳ hữu ích bên ngoài đó là tốt.

Here's the relevant doc section.

+0

oh, tôi Tôi sẽ quay trở lại nhiệm vụ này sau khi tôi đã sửa một vài thứ khác Tôi thực sự đã bao gồm các hình thức giòn nhưng tôi vẫn chưa sử dụng nó, vì chúng tôi sử dụng một phương pháp định dạng mẫu hơn. – Lacrymology

0

Những gì tôi đang làm về lĩnh vực có điều kiện là có một lớp cơ sở (mà thừa hưởng từ Form) và lớp con khác với các lĩnh vực có điều kiện bổ sung.

Sau đó, trong chế độ xem của tôi, tùy thuộc vào điều kiện tôi chọn biểu mẫu được phân lớp bắt buộc. Tôi biết rằng nó liên quan đến một số mã trùng lặp, nhưng nó có vẻ dễ dàng hơn so với các phương pháp khác.

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