2016-03-24 10 views
-1

私はajaxと2つのビューを使用しています。リダイレクトをうまく処理する方法がわからないことを除いて、すべてうまく動作します。明らかに、フォームを1ページに2回、別のページに2回レンダリングすることは冗長です。ユーザーをリダイレクトせずにモデルを更新するにはどうすればよいですか?2つのビューとajaxでモデルフォーム経由でモデルを更新するときのリダイレクトの処理

forms.py

class RecruitForm(forms.ModelForm): 
    jobnum = forms.ModelChoiceField(queryset=Job.objects.all()) 
    class Meta: 
     model = Job 
     fields = ['jobnum','rec_count'] 

view.py

def recruiting(request): 
    if request.method == 'POST': 
    recruit_form = RecruitForm(request.POST or None) 
    if recruit_form.is_valid(): 
     t = Job.objects.get(jobnum=recruit_form.cleaned_data.get('jobnum')) 
     t.jobnum = recruit_form.cleaned_data.get('jobnum') 
     t.rec_count = recruit_form.cleaned_data.get('rec_count') 
     t.save() 

def edit(request): #testing 

    jobnum = request.GET.get('jobnum') 
    job_list = Job.objects.filter(jobnum=jobnum) 
    json_data = serializers.serialize('json', job_list) 
    a = json.loads(json_data) 
    a = a[0]['pk'] 
    j = Job.objects.get(pk=a) 
    form = RecruitForm(request.POST or None ,instance=j) 
    instance = form.save(commit=False) 
    instance.save() 



    return render(request, "editrec.html", {"form":form}) 

javascript.jsを

$('.row2').click(function(){ 
    var a = $(this).data('jobnum') 
    $.ajax({ 
    url: "/edit/", 
    data: {'jobnum':a}, 
    success: function(data) { 

     console.log(data) 
     $(".divtest").html(data); 

     document.getElementById('editform').action='../edit/?jobnum=' + encodeURIComponent(a);  
    }, 
    }); 
}); 

urls.py

url(r'^edit/$','SiteTwo.views.edit', name='edit'), #testing 

editrec.html

{% load staticfiles %} 
{% load crispy_forms_tags %} 

{% block content %} 

    <form method='POST' id='editform' action = '' class='givemewhite'>{% csrf_token %} 
    {{form|crispy}} 
    <button class = 'btn btn-default' name='edit'/>Submit</button> 
    </form> 

{% endblock %} 

forms.py

class RecruitForm(forms.ModelForm): 
    jobnum = forms.ModelChoiceField(queryset=Job.objects.all()) 
    class Meta: 
     model = Job 
     fields = ['rec_count'] 

答えて

1

は、私はあなたがAJAX経由でロードされたフォームを送信する際、ユーザーが新しいページに移動するという事実を好きではないことを前提としています。そのようなことが起こらないようにするには、ロードされたフォームに'submit'イベントをトラップする必要があります。 javascript.jsを次のように変更することができます:

$('.row2').click(function(){ 
    var a = $(this).data('jobnum') 
    $.ajax({ 
    url: "/edit/", 
    data: {'jobnum':a}, 
    success: function(data) { 

     console.log(data) 
     var form = jQuery(".divtest").html(data).find('#editform'); 
     form.attr('action', '../edit/?jobnum=' + encodeURIComponent(a)); 
     form.submit(function() { 
      jQuery.ajax(form.attr('action'), { 
       data: form.serialize(), 
       method: form.attr('method').toUpperCase(), 
       success: function() { 
        /* Reload the containing document to show new data. */ 
        document.location.reload(); 
       } 
      }); 
      /* Disable propagation and prevent default action (browser navigates to new page and submits). */ 
      return false; 
     }); 
    }, 
    }); 
}); 
0
def recruiting(request): 
    # Create custom form to use here, taking only one input that is job that you want to change. you can use modelchoicefield for list. 


def edit(request): #testing 

    jobnum = request.GET.get('jobnum') 
    job_list = Job.objects.filter(jobnum=jobnum) 
    json_data = serializers.serialize('json', job_list) 
    a = json.loads(json_data) 
    a = a[0]['pk'] 
    j = Job.objects.get(pk=a) 
    form = RecruitForm(request.POST or None ,instance=j) 
    if request.POST: 
     if form.is_valid(): 
       form.save() 

    return render(request, "editrec.html", {"form":form}) 
+0

'something'部分はどのように機能しますか? djangoは 'modelchoicefield'でどのジョブ番号を選択したのでしょうか? –

+0

「何か」は、ページが読み込まれる前にシステムによって提供され、ユーザーによっては提供されません。あなたは仕事関連の詳細とその特定の仕事の選択を同じページで変更しようとしていますか? – RA123

+0

はい、すべてのジョブオプションを含むページに既にロードされているフォームがあります。ユーザーは更新するジョブを選択してから更新します。 –

関連する問題