django rest框架和表单:怎么做

Posted

技术标签:

【中文标题】django rest框架和表单:怎么做【英文标题】:django rest framework and forms: How to do 【发布时间】:2018-05-09 20:20:46 【问题描述】:

我的 Django 应用程序中有一个模型,如下所示。我使用 ReactJs 作为前端并使用 Django Rest Framework 传递数据。

class Ingredient(models.Model):
    MUNITS_CHOICES = (
        ('kg', 'Kilogram'),
        ('ltr', 'Liter'),
        ('pcs', 'Pieces'),
    )

    name = models.CharField(max_length=200,unique=True,null=False)
    slug = models.SlugField(unique=True)
    munit = models.CharField(max_length=10,choices=MUNITS_CHOICES,default=KILOGRAM)
    rate = models.DecimalField(max_digits=19, decimal_places=2,validators=[MinValueValidator(0)],default=0)
    typeofingredient = models.ForeignKey(TypeOfIngredient, related_name='typeof_ingredient',null=True, blank=True,on_delete=models.PROTECT)
    density_kg_per_lt = models.DecimalField(max_digits=19, decimal_places=2,verbose_name='Density (kg/lt)',null=True,blank=True,validators=[MinValueValidator(0)])
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)

如您所见,模型字段有很多参数,例如 max_length、choices、ForeignKey(也是一种选择)、DecimalField、CharField、DateTimeField 等

我正在使用 Django Forms 创建和呈现表单。验证也是在 Form 类中完成的。 这样做的好处是使用 form 可以很容易地将表单插入到模板中。它负责处理所有参数,如 max_length、选择、字段类型等。我们还可以验证表单并将错误发送回等。所以大部分工作都是自动完成的。

但由于我使用的是 DRF,所以我创建了一个序列化程序类来创建或更新:

class IngredientCreateUpdateSerializer(ModelSerializer):
    class Meta:
        model = Ingredient
        fields = [
            'name',
            'munit',
            'rate',
            'typeofingredient',
            'density_kg_per_lt',
        ]

这里我必须再次编写我在表单中完成的验证逻辑。

现在要在 reactjs 中创建 html 表单,我必须手动查看每个表单参数(如字段类型、必需等)并创建表单,然后链接 api 端点以在提交按钮上创建/更新。 此外,选择字段的选项必须作为单独的端点传递。

需要的解决方案 1:创建表单 api

那么是否有一个表单 api 可以将所有字段及其参数(如 max_length、必需、选择字段的选择、外部字段的选择)传递给 reactjs。这样我就得到了一些蓝图来在 reactJs 中创建表单。以后即使我更改模型或参数,一切都可以由 api 处理。

需要的解决方案 2:验证逻辑是否可用于序列化程序和 表格

我是否还必须为序列化程序类编写验证代码,或者有什么方法可以链接到我已经使用过的表单类。

我主要是在寻找解决方案1

:因为解决方案 2 更多的是输入两次验证,这很好。

【问题讨论】:

【参考方案1】:

我通读了您的解决方案方案。我使用 Django-reactjs。为了让自己变得简单,。

使用这个模板https://github.com/Frojd/django-react-templatetags

您提到了模型类参数。它可以作为后缀,因为您有兴趣将模型参数传递给前端。

另一个选项是:React 在 Webpack(模块捆绑器)和 Babel(转译器)的帮助下,将您的 javascript 打包并转译成单个或多个文件,这些文件将放置在入口 HTML 页面中。学习 Webpack、Babel、Javascript 以及 React 和 Redux(一个状态容器)。我相信你不会使用 Django 模板,但是 而是允许 React 渲染前端。

如果您还有其他问题,请告诉我

【讨论】:

最近我开始使用 webpack、babel 和 react。我会检查这个,

以上是关于django rest框架和表单:怎么做的主要内容,如果未能解决你的问题,请参考以下文章

JS 框架能够基于(django)rest api 选项生成表单

是否可以在 django rest 框架序列化程序中使用重用 django 表单进行验证?

使用 React 和 Django Rest 框架的多步表单处理

Django Rest Framework 序列化器作为表单和嵌套关系

如何使用 Django 的表单框架来选择选项?

如何在 Django REST Framework HTML 表单中自动设置 DateTime 字段的值?