Django表单,我应该编写前端代码来显示自定义表单吗?

时间:2017-03-14 12:35:35

标签: javascript angularjs django reactjs

class Teacher(models.Model):
    name = CharField


class Child(models.Model):
    name = CharField
    teacher = models.ForeignKey(
        'Teacher',
        on_delete=models.CASCADE,
        related_name='nodes',
    )

我正在拧一个配置页面,不喜欢正常的解决方案,使用django模板渲染html页面,并使用相同的模板更新,我可以点击"添加"那么我可以输入新的孩子信息,换句话说,我可以和一位老师一起添加多个孩子。

class TeacherCreate(View):
    template_name = 'config/teacher_add.html'

    def get(self, request):
        teacher_form = TeacherForm()
        children_list = [ChildrenForm(), ]

        return render(request, self.template_name, {
                'teacher_form': teacher_form, 
                'children_list': children_list, 
            })

    def post(self, request):
        received_json = json.loads(request.body)
        children_list = received_json['children_list']
        children_form_list = []
        teacher_form = TeacherForm({'name': received_json['name']})
        valid = True

        try:
            with transaction.atomic():
                teacher = None
                if teacher_form.is_valid():
                    teacher = teacher_form.save()
                else:
                    valid = False

                for child in children_list:
                    children_form = ChildrenForm(child)
                    if children_form.is_valid():
                        if valid:
                            children = children_form.save(commit=False)
                            children.teacher = teacher
                            children.save()
                    else:
                        valid = False
                    children_form_list.append(children_form)

                if not valid:
                    # rollback
                    raise KeyError
        except KeyError:
            # rollback
            pass

        if valid:
            return redirect(reverse("config:teacher_list"))
        else:
            return HttpJson({
                    'teacher_form': teacher_form,   # here I have to convert to normal data, and extract errors
                    'children_list': children_form_list, # here I have to convert to normal data, and extract errors
                })
但是正如你所看到的,我必须将表单转换为普通的字典数据到客户端,而客户端必须使用一些模板引擎将json数据渲染到html页面。也就是说,我必须编写相同的渲染代码(不是相同的模板语法),一个使用javascript的模板,一个使用django的模板。所以我应该只使用reactjs渲染表单部分,这意味着(服务器只渲染整个html页面,但不包括表单部分,表单部分使用reactjs或其他任何javascript代码请求,并渲染)

1 个答案:

答案 0 :(得分:0)

为此,我通常只创建一个小模板(称之为组件)并在模板上返回render。如果您还要传回一些额外的变量,可以使用render_to_string并将其插入字典中,如:

return JsonResponse({
  "html": render_to_string(template, context, request),
  "var1": "value",
  "var2": "value"
})

然后使用response.html在javascript中访问它。

这确实会给您的服务器增加一些额外的工作,对于接收大量流量的网站来说并不理想。如果您只是想在javascript中轻松呈现响应,则不需要做出反应。

编辑:或者你可以使用一些模板引擎(小胡子,把手)。您可以在django中创建模板,在页面中将其作为javascript变量呈现,然后根据该模板进行渲染。