通过具有 2 个视图和 ajax 的模型窗体更新模型时处理重定向



我正在使用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

编辑.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']

我假设您不喜欢用户在提交通过 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;
        });
    },
    });
});
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})

最新更新