【问题标题】:How Do I Incorporate Ajax into a CreateView?如何将 Ajax 合并到 CreateView 中?
【发布时间】:2021-12-06 19:14:35
【问题描述】:

我有一个 CreateView...它在传统意义上可以正常工作。我试图将其本质上转换为 AJAX 以进行提交,因为用户可以将文件附加到表单,并且我试图避免基于用户错误的表单提交失败。这是我的 CreateView...

class CreateProcedureView(LoginRequiredMixin,CreateView):
    model = NewProcedure
    form_class = CreateProcedureForm
    template_name = 'create_procedure.html'

   def form_valid(self, form):
        instance = form.save()

    def post(self, request, *args, **kwargs):
        if "cancel" in request.POST:
            return HttpResponseRedirect(reverse('Procedures:procedure_main_menu'))
        else:
            self.object = None
            user = request.user
            form_class = self.get_form_class()
            form = self.get_form(form_class)
            file_form = NewProcedureFilesForm(request.POST, request.FILES)
            files = request.FILES.getlist('file[]')
            if form.is_valid() and file_form.is_valid():
                procedure_instance = form.save(commit=False)
                procedure_instance.user = user
                procedure_instance.save()
                list=[]
                for f in files:
                    procedure_file_instance = NewProcedureFiles(attachments=f, new_procedure=procedure_instance)
                    procedure_file_instance.save()
                return self.form_valid(form)
            else:
                form_class = self.get_form_class()
                form = self.get_form(form_class)
                file_form = NewProcedureFilesForm(request.POST, request.FILES)
                return self.form_invalid(form)

如前所述,它可以正常工作。我想弄清楚的是如何最好地将其转换为 AJAX 类型的方法?这是我到目前为止所拥有的......

这是我的 AJAX...

 $(document).ready(function (){

  var token = '{{csrf_token}}';

  $("#forms").on('submit', function(event) {
        event.preventDefault();
        var newprocedure = '{{ newprocedure }}';
        $.ajax({
            type: "POST",
            headers: { "X-CSRFToken": token },
            url: "{% url 'Procedures:ajax_posting' %}",
            data:$("#forms").serialize(),
            datatype:'json',
            success: function(data) {
              console.log("here");
              if (data['success'])
                 alert("successfully added to favorites")
            }
        });
   });
 });

这是我试图调用的视图...

def ajax_posting(request):
    user = request.user
    data = request.POST
    form = CreateProcedureForm(user,data=data)
    if request.method=='POST':  
        return JsonResponse({'success':'True'})
    else:
        print(form.errors)
    return JsonResponse(data)

我可以看到它正在调用视图,因为 print(form.errors) 向我显示了必填字段的一堆错误,我希望这是因为在我填写后表单似乎没有被处理,并且点击提交绝对没有任何反应。

提前感谢您的任何想法。我是 AJAX 的新手。

【问题讨论】:

    标签: django ajax django-rest-framework django-views django-templates


    【解决方案1】:

    您可以使用之前的视图进行处理。它只需要一点点调整。

    提交时,您可能希望在 ajax 脚本中将表单实例化为 JS FormData

    data:  FormData(forms[0])
    

    这样就可以用 django 接收数据了

    data = request.POST
    

    然后用你的 django 表单实例化它以进行处理

    form = RegForm(data=data)
    

    【讨论】:

    • 感谢您的回复。所以我明白你是说把它放在我的 Ajax 脚本上,把 data = request.POST 放在我的模型上,而 form = RegForm(data=data) 到底在哪里?也在模型上?
    • 型号?不是模特。他们应该进入你的视野
    • 我的错。漫长的一天。这就是我的意思......查看......它似乎正在工作......至少它正在提交。我还在测试。但我确实注意到您的一个建议导致错误...FormData(forms[0])...导致 Unexpected token '[' 错误。它似乎有效,但我不知道如何解决该错误。
    • 我做了一些改变,它更接近我认为应该做的事情......我正在更新我上面的代码示例......最重要的是,这现在正在捕获我的表单更准确,但它没有提交。
    • 我把范围缩小了。如果我使用您的建议...data: { FormData(forms[0]) },它可以工作....但是我有语法错误...如果我使用 data:$("#forms").serialize( ),表单将不会提交。我应该如何解决这个问题?
    猜你喜欢
    • 2012-07-16
    • 2019-12-31
    • 2018-07-23
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多