Django Rest Framework render_form & 必填字段

Posted

技术标签:

【中文标题】Django Rest Framework render_form & 必填字段【英文标题】:Django Rest Framework render_form & required fields 【发布时间】:2016-09-18 01:29:43 【问题描述】:

在 DRF 中使用 HTML 表单渲染器时,任何人都可以想出一个好方法来自动在 DRF 中生成一些“必填”字段的指示,不管是不择手段吗?我的意思是在我提交表单之前,在需要的字段上的一些指示 - 可浏览的 API 它将以错误的形式正确显示,但仅在提交后。

我是否将此处所示的技术用于具有字段级 html 表单(而不仅仅是原始/JSON 表单)的可浏览 API:

django-rest-framework - autogenerate form in browsable API?

或者我正在使用 TemplateHTMLRenderer 调用 render_form ,如此处文档中所述:

http://www.django-rest-framework.org/topics/html-and-forms/#rendering-forms

我没有看到一种简单的方法来使我的必填字段按要求呈现。所以说我们喜欢

#models.py
class Foobar(model.Models):
  foo = models.CharField(max_length=100, blank=True, default='')
  bar = models.CharField(max_length=100, blank=False)

我能想到的最好的方法是为每种类型的字段“required-text-field.html”、“required-checkbox.html”等制作自己的模板/sn-p,并在序列化程序中使用样式声明如图所示:

http://www.django-rest-framework.org/topics/html-and-forms/#field-styles

假设我理解这一点,还没有玩过它。

但我希望看到一种基于模型定义,根据需要自动生成字段的方法(即使只是一个星号,或应用一个 CSS 类)(甚至只是一个星号,或应用一个 CSS 类)。

Rambling:这里的目标是避免编写我自己的表单,让 DRF 在自定义视图中为我生成表单。与使用将它们绑定到 AJAX 来编写我自己的表单相反,我认为模板、render_form 和一些格式检查就足够了。但现在我认为 DRF 是为后端和开发人员构建的,而不是前端,如果最终用户可见,也许我应该计划编写自己的表单?此外,我可以拥有 CSS 文件并根据名称进行选择,调用 render_form 然后应用手工旋转样式,这比 HTML + CSS 的工作量要少。我应该查看 Django(只是 Django,而不是 DRF)表单并重新使用序列化程序作为验证吗?...

【问题讨论】:

【参考方案1】:

我可以看到两种方式:

您可以定义自己的模板包,查看源中的现有模板包(例如“rest_framework/horizo​​ntal/input.html”) - 您可以检查是否需要字段并根据此标志设置一些 css。你不需要额外的东西,尤其是“input-readonly.html” - 只需制作自己的 input.html 副本,添加一些 if-s 即可。

或者您可以在 API 端点上调用 OPTIONS 以获取有关字段的所有必要信息,不仅是 required,还有 readonly 和某些选择的允许值 - 如果您可以从 javascript 更新表单

【讨论】:

由于某种原因,第一种方法在我阅读时对我没有吸引力,但今天我想我会尝试一下。我在想 form.field.required 会起作用,但需要检查......无论如何,这听起来比我想象的要少。我也喜欢关于 OPTIONS 的想法,我认为这是 android/ios 访问的最佳方式(也为此目的使用令牌)。

以上是关于Django Rest Framework render_form & 必填字段的主要内容,如果未能解决你的问题,请参考以下文章

怎么安装django rest framework

django rest framework中文介绍

17-Django-Django REST framework-REST framework及RESTful简介

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

Django:rest framework之分页(Pagination)

django使用rest_framework