2017-04-18 14 views
0

私のDjango-allauthサインアップフォームで、crispフォームを使用してnoRecaptchaフォームを取得できました。 Using this answerDjango Reoder norecaptchaはallauthに登録しました。新鮮なフォームを使用しています

フォームは、フォームがdjango-allauthに含まれていてレイアウトを指定していないときに、クリスピーフォームのレイアウトにフィールドオーダーを強制することに関するものです。だから自分のカスタムフォームでサインアップフォームをオーバーライドするとき、私はレイアウトを指定しようとしましたが、それが認識されているかどうかはわかりません。
は、他の記事の回答を組み合わせる:

from django import forms 
from neatf.users.models import User 

from nocaptcha_recaptcha.fields import NoReCaptchaField 


class AllauthSignupForm(forms.Form): 
    captcha = NoReCaptchaField() 

    class Meta: 
     model = User 
     fields = ['username', 'email', 'password1', 'password2', 'captcha'] 
     field_order = ['username', 'email', 'password1', 'password2', 
         'captcha'] 

    def signup(self, request, user): 
     """ Required, or else it throws deprecation warnings """ 
     pass 

私は私が間違ったモデルが参照しているか、それは単に無視だと確信しています。 noRecaptchaフィールドは、私が好きな場所の底ではなく、フォームの上部にうっかりと座っているだけです。

私もFormHelperを使ってみましたが、明らかに間違っている必要があります。

helper = FormHelper() 
helper.form_class = '.form-inline' 
helper.field_template = 'bootstrap4/layout/inline_field.html' 
helper.layout = Layout(
    Fieldset('Contact data', 'username', 'email',), 
    Fieldset('Password', 'password1', 'password2', 'captcha')) 

私はむしろテンプレートを書き直したいと思いますし、レイアウトを上書きする方法があることを願っています。

答えて

0

githubのdjango-crispyに関する報告された問題でこれに対する答えが見つかりました。 "undocumented" feature(当時)、私は最終的にfound in the docs on tags reference(レイアウトのセクションでは触れられていません)です。

signup.html

<form class="signup" id="signup_form" method="post" action="{% url 'account_signup' %}"> 
    {% csrf_token %} 

    {{ form.username|as_crispy_field }} 
    {{ form.email|as_crispy_field }} 
    {{ form.password1|as_crispy_field }} 
    {{ form.password2|as_crispy_field }} 
    {{ form.captcha|as_crispy_field }} 

    {% if redirect_field_value %} 
     <input type="hidden" name="{{ redirect_field_name }}" value="{{ redirect_field_value }}"/> 
    {% endif %} 

    <script src='https://www.google.com/recaptcha/api.js'></script> 
    <button class="btn btn-primary" type="submit">{% trans "Sign Up" %} &raquo;</button> 
</form> 

forms.py

from django import forms 

from nocaptcha_recaptcha.fields import NoReCaptchaField 


class AllauthSignupForm(forms.Form): 
    captcha = NoReCaptchaField() 

    def signup(self, request, user): 
     """ Required, or else it throws deprecation warnings """ 
     pass 

うまくいけ:非常に簡単でforms.pyのゼロ変化を必要とする、テンプレート上で行わ

これは他人を助ける。

0

以前にこの問題の解決策を探して、このメソッドを使用:

class AllauthSignupForm(forms.Form): 
#https://developers.google.com/recaptcha/docs/display 
#https://github.com/praekelt/django-recaptcha 
captcha = ReCaptchaField(
    attrs={ 
     'theme' : 'clean', 
     'size' : 'normal', #compact 
    }) 
captcha.label = "Капча" 

def __init__(self, *args, **kwargs): 
    super(AllauthSignupForm, self).__init__(*args, **kwargs) 
    original_fields = self.fields 
    new_order = OrderedDict() 
    for key in ['username', 'email', 'password1', 'password2', 'captcha']: 
     if key in original_fields: 
      new_order[key] = original_fields[key] 
    self.fields = new_order 

def signup(self, request, user): 
    """ Required, or else it throws deprecation warnings """ 
    pass 

関連の答え:

How does Django Know the Order to Render Form Fields?

How can I order fields in Django ModelForm?

django-allauth: rearrange form fields (change order)

を解決策は、私が順序を設定することはできません新しいバージョンの0.29 ==バージョンジャンゴ・allauthで動作し、新しいバージョンで

(0.30から0.31のためのテストを)動作しません

+0

私はdjango-allauth(0.31.0)を手に入れました。あなたのコードを使ってrecaptchaを電子メールの後ろに移動させました(注文を表示します:username、email、recaptcha、password1、password2)。改良だが、キャプチャを最後まで強制する方法は不明だ。ありがとう – wedward

関連する問題