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?
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 đó. –
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
Đó 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. –