【问题标题】:Django Validators : check if two fields values have the same id in the databaseDjango Validators:检查两个字段值在数据库中是否具有相同的 id
【发布时间】:2018-08-27 21:39:22
【问题描述】:

我是 Django 新手,我有一个包含两个字段的表单: 客户姓名和账单号码。 我创建了一个验证器,用于测试帐单编号是否已存在于数据库表中(称为帐单)。 但是现在我需要将此验证器转换为除先前测试之外的另一个测试器,如果客户端名称存在于同一表行中(更简单地说:如果客户端名称和帐单编号具有相同的 pk)。 验证器:

def validate_url(value):
    try:
        entry=facture_ventes.objects.get(numfac=value)
    except ObjectDoesNotExist:
        entry = None
    if entry is not None:
        factexist=facture_ventes.objects.all().filter(id=entry.id).count()
        if factexist  is not None:
            raise ValidationError("Numéro de Facture déja saisi ! ")

形式:

class SubmitUrlForm(forms.Form):
    numfacture=forms.CharField(label='Submit Form', validators=[validate_url])

这是数据库表:

https://i.stack.imgur.com/3xmpd.png

请提供任何帮助,因为我知道验证器无法返回值,所以我被困在这里。谢谢你

【问题讨论】:

    标签: django forms validation


    【解决方案1】:

    您可以尝试使用 get_or_create() 方法:

    obj, created = MyModel.objects.get_or_create(first_name='Angus', last_name='Young') 这可能会返回:

    • 如果存在:

    obj: 数据库中的对象

    created: 错误

    • 如果不存在:

    obj: 新创建的对象

    created:是的

    【讨论】:

      【解决方案2】:

      这不是验证器的工作,而是表单的clean 方法。

      def clean(self):
          numfac = self.cleaned_data.get('numfacture')
          try:
              entry=facture_ventes.objects.get(numfac=numfac)
          except ObjectDoesNotExist:
              entry = None
          if entry is not None:
              factexist=facture_ventes.objects.all().filter(id=entry.id).count()
              if factexist is not None:
                  raise forms.ValidationError("Numéro de Facture déja saisi ! ")
              if entry.client_name == self.cleaned_data.get('client_name'): # or whatever
                  raise forms.ValidationError("Facture avec ce numéro et cliente existe déjà")
      

      【讨论】:

      • 非常感谢您的回答。好的,我明白了,我会测试它。我想干净的方法应该在我的视图文件中?对吗?
      • 不,这是表单上的一个方法。
      • 非常感谢你帮了我很多忙
      • 我有一个问题,如果我将第二个字段转换为 ModelChoiceField 会有什么修改吗?提前谢谢你
      猜你喜欢
      • 2014-02-03
      • 2013-11-09
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 2019-03-22
      • 2019-07-30
      • 2017-11-02
      • 2018-02-11
      相关资源
      最近更新 更多