【问题标题】:What is the best way for connecting Django models choice fields with React js select options将 Django 模型选择字段与 React js 选择选项连接的最佳方式是什么
【发布时间】:2020-11-06 04:10:15
【问题描述】:

我发现自己陷入了处理 Django 模型选择字段和反应选择选项的困境。愿有人好心帮忙。这是我的模型代码:

class AccountType(models.Model):

    category = models.SmallIntegerField(
        choices=(
            (AccountCategories.ASSET, "Asset"),
            (AccountCategories.LIABILITY, "Liability"),
            (AccountCategories.EQUITY, "Equity"),
            (AccountCategories.REVENUE, "Revenue"),
            (AccountCategories.EXPENSE, "Operating Expense"),
        )
    )

    classification = models.SmallIntegerField(
        choices=(
            (AccountClassifications.NONE, ""),
            (AccountClassifications.CURRENT, "Current"),
            (AccountClassifications.NONCURRENT, "Long-Term"),
        )
    )

我似乎无法弄清楚如何使这些选择成为我在 React 形式中的选择选项。正在考虑解决方案可能是在我的序列化程序中验证或清理这些选择,但我坚持如何特别是与 React Form 链接。提前致谢

【问题讨论】:

    标签: django reactjs django-rest-framework


    【解决方案1】:

    所以我想起了 Beazley 的 Python 内置 SuperHeros 教程或类似的东西,并想出了这个解决方案。就 DRY 原则而言,它可能不是最好的,但它就像一种魅力,对于那些在同样的问题上苦苦挣扎但没有其他办法的人来说,我是这样做的:

      ACCOUNT_TYPES_CATEGORY_CHOICES = [
            (100, 'Do Not Choose Me'),
            (0, 'Asset'),
            (1, 'Liability'),
            (2, 'Equity'),
            (3, 'Revenue'),
            (4, 'Operating Expense')
    
        ]
    

    我将选项放在一个单独的文件中。

    class AccountType(models.Model):
        class Meta:
            ordering = ['order']
    
        objects = AccountTypeManager()
    
        category = models.IntegerField(choices=ACCOUNT_TYPES_CATEGORY_CHOICES)
    
        classification = models.IntegerField(choices=ACCOUNT_TYPES_CLASSIFICATION_CHOICES)
    
    

    我导入文件并将其放入我的模型中并调用 python manage.py makemigrations

     class AccountingPeriodsChoicesAPIView(views.APIView):
    
    
        def get(self, request, format=None):
    
            my_choices = []
            choice_dict = dict(ACCOUNTING_PERIODS_CHOICES)
            for key, value in choice_dict.items():
    
                itered_dict = {"key": key, "value": value}
                my_choices.append(itered_dict)
            return Response(my_choices, status=status.HTTP_200_OK)
    

    我为它创建了一个 api 端点。我知道这可能工作量太大,但确实有效。将其转换为字典,然后通过 .items() 将其解包,并分配值和键,然后在 Response 中返回它就可以了。将其称为端点允许我在 redux 状态下对其进行管理,并按照它的假设进行操作。中提琴!!!!!!

    【讨论】:

      【解决方案2】:

      您可以使用django-js-choices

      从文档看,用法很简单:

      概述 Django JS Choices 是一个小型的 Django 应用程序,它可以处理 javascript中的模型字段选择很容易。

      例如,给定模型……

      # models.py:
      
      class Student(models.Model):
          FRESHMAN = 'FR'
          SOPHOMORE = 'SO'
          JUNIOR = 'JR'
          SENIOR = 'SR'
          YEAR_IN_SCHOOL_CHOICES = (
              (FRESHMAN, 'Freshman'),
              (SOPHOMORE, 'Sophomore'),
              (JUNIOR, 'Junior'),
              (SENIOR, 'Senior'),
          )
          year_in_school = models.CharField(
              max_length=2,
              choices=YEAR_IN_SCHOOL_CHOICES,
              default=FRESHMAN,
          )
      

      ...这些选项可以在 javascript 中访问。

      Choices.pairs("year_in_school");
      

      结果:

      [
          {value: "FR", label: "Freshman"},
          {value: "SO", label: "Sophomore"},
          {value: "JR", label: "Junior"},
          {value: "SR", label: "Senior"}
      ]
      

      显示值也可以访问。

      Choices.display("year_in_school", "FR")
      Choices.display("year_in_school", {"year_in_school": "FR"})
      

      在这两种情况下,结果都是

      "Freshman"
      

      【讨论】:

      • 非常感谢我一直在努力解决这个问题。会调查它并会回来。非常感谢
      • 我确实检查了库,它似乎不错,但与 django ==3.0 不兼容。感谢您的努力,这对我来说意义重大
      • 在需求中说它支持 Django (1.5+)
      • 它正在卸载我的 django==3.0 版本,我立即停止了它。但是图书馆帮助我清楚地看到了事物。非常感谢,您可以随时查看我是如何在下面解决的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 2012-09-24
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多