Python DRF-HTML创建表单的呈现模型序列化程序
我正在尝试渲染一个窗体以创建新对象。我已经在一个单独的应用程序中定义了我的API,现在我想在同一项目的另一个应用程序中使用它。我遵循了教程,现在我有了一个默认路由器、一个ModelSerializer和一个ModelViewSet,以及一个自动创建的可浏览HTML API,该API还可以在列表页面上自动呈现HTML表单,以创建新对象。我想在我的项目中包括这个表单。 当然,我可以自己编写一个表单,只需使用jQuery向API发出POST请求,但随后我必须手动为每个模型创建一个表单。如果模型发生变化,我必须更新表格。我希望通过使用DRF和此处的文档来实现这一点: 遗憾的是,我在网上没有找到任何例子。我确实发现了一个关于StackOverflow的问题,但没有解决方案 类任务视图集(viewsets.ModelViewSet):(在API/views.py中) 类TaskSerializer(serializers.ModelSerializer):(在API/serializers.py中) 在urls.py中,我使用默认路由器并添加以下内容:Python DRF-HTML创建表单的呈现模型序列化程序,python,html,django,forms,django-rest-framework,Python,Html,Django,Forms,Django Rest Framework,我正在尝试渲染一个窗体以创建新对象。我已经在一个单独的应用程序中定义了我的API,现在我想在同一项目的另一个应用程序中使用它。我遵循了教程,现在我有了一个默认路由器、一个ModelSerializer和一个ModelViewSet,以及一个自动创建的可浏览HTML API,该API还可以在列表页面上自动呈现HTML表单,以创建新对象。我想在我的项目中包括这个表单。 当然,我可以自己编写一个表单,只需使用jQuery向API发出POST请求,但随后我必须手动为每个模型创建一个表单。如果模型发生变化
router.register(r'questions', views.TaskViewSet, 'question')
现在,在我的另一个应用程序(同一个项目)中,我想创建一个表单,因此我将以下代码添加到模板中:
<form action="{% url 'api:question-list' %}" method="POST">
{% csrf_token %}
{% render_form serializer template_pack='rest_framework/vertical' %}
<input type="submit" value="Save">
</form>
{%csrf_令牌%}
{%render\u form序列化程序模板\u pack='rest\u framework/vertical%}
可悲的是,我现在遇到了一个错误,在尝试访问该网站时,它对我毫无帮助
“str”对象没有属性“data”
我曾尝试将渲染器类的字段添加到我的ModelViewSet中,但随后我的可浏览API中断,不再可用。我只想包括在屏幕截图底部呈现的表单。这是可能的还是我真的必须手动构建它
我有同样的任务,在我的例子中,我使用
render\u field
-{%load rest\u framework%}{%render\u field serializer.name%}
如果您将render\u form更改为render\u field,它会对您有效吗?我甚至在文档中都没有render\u field。。。当我使用它时,我得到以下错误:“render\u field”没有收到参数的值:“style”,所以我添加了style='rest\u framework/vertical'
现在错误是“SafeText”对象没有属性“get”-我快疯了。也许我试图实现的不是DRF的使用方式您有错误消息,因为您的模板上下文中没有序列化程序变量。您需要在响应中传递“serializer”:TaskSerializer()。我想我已经接近解决方案了。我仍然有相同的错误,但当我检查调试消息时,我现在可以在本地变量中看到序列化程序中的字段:context\u dict{'serializer':TaskSerializer():id=IntegerField(label='id',read_only=True)owner=ReadOnlyField(source='owner.name')我的视图只有3行长:def manage_tasks(请求):context_dict={}context_dict['serializer']=TaskSerializer()返回render(请求,'portal/manage_tasks.html',context_dict)
它可以工作!非常感谢。我再次将模板更改为呈现表单序列化程序
,现在它呈现表单,当我点击提交时,它在数据库中创建了一个对象。这正是我所需要的。虽然操作url明显错误,因为它指向可浏览的API。我有相同的任务,在我的情况下,我使用呈现d
-{%load rest\u framework%}{%render\u field serializer.name%}
如果将render\u form更改为render\u field,它是否适用于您?我甚至没有在文档中呈现\u字段…使用它时,我会出现以下错误:“render\u field”没有收到参数的值:'style',所以我添加了style='rest\u framework/vertical'
现在错误是'SafeText'对象没有属性'get'-我快疯了。也许我试图实现的不是DRF的使用方式。你有错误消息,因为模板上下文中没有序列化程序
变量。你需要传递'serializer':TaskSerializer()。我想我正在接近解决方案。我仍然有相同的错误,但当我检查调试消息时,我现在可以在本地变量中看到序列化程序中的字段:context\u dict{'serializer':TaskSerializer():id=IntegerField(label='id',read_only=True)owner=ReadOnlyField(source='owner.name')…
唯一缺少的就是以某种方式呈现它。我的视图只有3行长:def manage_tasks(请求):context_dict={}context_dict['serializer']=TaskSerializer()返回呈现(请求,'portal/manage_tasks.html',context_dict)
它可以工作!非常感谢。我再次将模板更改为render\u form serializer
,现在它呈现表单,当我点击提交时,它在数据库中创建了一个对象。这正是我所需要的。尽管操作url明显错误,因为它指向可浏览的API。
router.register(r'questions', views.TaskViewSet, 'question')
<form action="{% url 'api:question-list' %}" method="POST">
{% csrf_token %}
{% render_form serializer template_pack='rest_framework/vertical' %}
<input type="submit" value="Save">
</form>