Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DRF-HTML创建表单的呈现模型序列化程序_Python_Html_Django_Forms_Django Rest Framework - Fatal编程技术网

Python DRF-HTML创建表单的呈现模型序列化程序

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请求,但随后我必须手动为每个模型创建一个表单。如果模型发生变化

我正在尝试渲染一个窗体以创建新对象。我已经在一个单独的应用程序中定义了我的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中,我使用默认路由器并添加以下内容:

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>