2016-06-26 4 views
0

JQueryを使用してDjangoのフォームにフィールドを動的に追加しようとしています。私はいくつかの似たような質問を見つけましたが、問題を最もよく扱うものはits this oneと思います。テンプレートからの値をPOSTリクエストで表示するときの問題

私はほとんどのロジックを理解していますが、私の場合は動作させることができません。 さらに、私はなぜ彼が何らかの形で何かをやっているのか分かりません。

(上記のリンクによる)私のコードは次のようになります。

ビュー

def create_one(request): 
    if request.method == 'POST': 
     form_empty_layer = UploadEmptyLayerForm(request.POST, extra=request.POST.get('extra_field_count')) 

     if form_empty_layer.is_valid(): 
      print "valid!" 
    else: 
     form = UploadEmptyLayerForm() 
    return render(request, "template", { 'form_empty_layer': form_empty_layer }) 

フォーム

class UploadEmptyLayerForm(forms.Form): 

    empty_layer_name = forms.CharField(max_length=255, required=True, label="Name of new Layer") 

    extra_field_count = forms.CharField(widget=forms.HiddenInput()) 

    def __init__(self, *args, **kwargs): 

     extra_fields = kwargs.pop('extra', 0) 
     super(UploadEmptyLayerForm, self).__init__(*args, **kwargs) 
     self.fields['extra_field_count'].initial = extra_fields 

     for index in range(int(extra_fields)): 
      # generate extra fields in the number specified via extra_fields 
      self.fields['extra_field_{index}'.format(index=index)] = \ 
       forms.CharField() 

テンプレート

<form id="empty-layer-uploader" method="post" enctype="multipart/form-data" action="{% url "layer_create" %}"> 
    <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"> 
     {% for field in form_empty_layer.visible_fields %} 
     {{ field|as_bootstrap }} </br> 
     {% endfor %} 
     <button type="button" id="add-another">add another</button> </br> </br> 
     <button type="submit" id="empty-layer-button" class="btn btn-danger" name="emptylayerbtn">Upload</button> 
    </form> 

とjQuery:

form_count = $("[name=extra_field_count"); 
// get extra form count so we know what index to use for the next item. 
$(document.body).on("click", "#add-another",function(e) { 
    element = $('<input type="text"/>'); 
    element.attr('name', 'extra_field_' + form_count); 
    $("#empty-layer-uploader").append(element); 
    // build element and append it to our forms container 

    form_count ++; 

    $("[name=extra_field_count]").val(form_count); 

    // increment form count so our view knows to populate 
    // that many fields for validation 
    }) 

私は、ボタン要素(タイプ=ボタン)でのtype属性を追加した気づくかもしれませんが。 また、そのjqueryのの1行目に何が起こっているのか私には明確ではない:

form_count = $("[name=extra_field_count"); 

がform_count = 0を設定することとしていませんか?そうでなければ、 ']'が行方不明になっているのではないか?コードが作成された入力要素の数を取得したことがない

int() argument must be a string or a number, not 'NoneType' 

:私はこれを実行しようとすると

それにもかかわらず、私はそれを取得します。 私はビューに手動で追加の変数を設定した場合、全体のプロセスは、作業を開始:

form_empty_layer = UploadEmptyLayerForm(request.POST, extra=3) 

だから私は値がテンプレートからビューに正しく渡されていない理由の質問があると思います。

PYTHONのERROR

Traceback (most recent call last): 
    File "/home/vagrant/.venvs/geonode/lib/python2.7/site-packages/django/core/handlers/base.py", line 112, in get_response 
response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/vagrant/.venvs/geonode/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 22, in _wrapped_view 
return view_func(request, *args, **kwargs) 
File "/home/vagrant/geonode/geonode/layers/views.py", line 885, in layer_create 
form_empty_layer = UploadEmptyLayerForm(request.POST, extra=request.POST.get('extra_field_count')) 
File "/home/vagrant/geonode/geonode/layers/forms.py", line 324, in __init__ 
for index in range(int(extra_fields)): 

はTypeError:int型()の引数は@Ianの勧告を使用して文字列または数値ではなく、 'NoneType'

EDIT

でなければなりません私が得たエラーを解決しました。しかし、私はまだ新しく追加されたフィールドから値を取得しようとすると問題が発生します。 2つの新しいフィールドを追加し、私の見解で実行することにより :

data = form_empty_layer.cleaned_data 
print data 

私が取得:

{'empty_layer_name': u'4234', 'extra_field_1': u'', 'extra_field_0': u'', 'extra_field_count': u'5645', 'geom_type': u'POINT'} 

だからアプリケーションのアーキテクチャとは本当に間違って何かがあります。キー:extra_field_1とextra_field_2には、追加した値が入力されている必要があります。代わりに、extra_field_countは私が追加した2つの値の最新の値を取得します。

+0

ほとんどの場合、ブラウザのコンソールにJSエラーと端末にPythonエラーがあるはずです。両方を共有してください。 – rnevius

+0

ありがとうございます。私は実際にWeb開発者ツールで何も得られません。そして私はすでにPythonで得たエラーを述べました。しかし、私は完全なエラーで質問を編集しました。 – user1919

答えて

1

request.POST.get('extra_field_count')がこのエラーの原因であるようです。フォームフィールドextra_field_countに余分なフィールドカウントがない場合、値はありません。しかし、Noneの値へのポインタはまだ存在しています。のinitメソッドにはという値がありますが、その値はnoneです。

この例を検討してください。

>>> mydict = {'a':None} 
>>> print mydict.pop('a') 
None 

request.POSTkwargsはちょうどmydictのような辞書です。

最も簡単な修正方法はありますか?フォームの__init__メソッドのヌル値を確認します。

​​
+0

ありがとうございます。これにより、エラーが修正されます。しかし、私はまだ私のフォームを正しく動作させることができません。検証テスト(form.is_valid)に合格しません。これがどうして起こるのでしょうか? – user1919

+0

私は何が起こっているか知っていると思います。私が作成する新しいフィールドについては、それらを必須にする必要があると設定しました(必須= True)。私はこれがエラーを引き起こしていると思います。 required = Falseを設定すると、実際にフォームの検証にパスします。しかし、私は、新しく生成されたフィールドからデータを取得する方法を見つける必要があります。どんな助けも高く評価されます! – user1919

+0

2つの新しいフィールドを追加すると、新しい追加フィールドの最後の値をprint(extra_field_count)としてアクセスできますが、前のフィールドにはどうすればアクセスできますか? – user1919

関連する問題