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代码请求,并渲染)
答案 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变量呈现,然后根据该模板进行渲染。