【问题标题】:Django Form Field validationDjango 表单字段验证
【发布时间】:2017-08-03 18:44:21
【问题描述】:

我有一个需要 URL 作为输入的表单。我想检查网址是否以http:// 或https:// 开头。

如果开头没有这两个“stings”之一,则表单提交应该会出错。

我不知道如何开始使用它,并且基于我对 django 的有限知识找不到任何信息,我不知道要查找哪些搜索词。

一个基本的提示会很有帮助。

谢谢!

我当前的 forms.py 有一个基于模型的表单:

class AddUrlForm(forms.ModelForm):

    class Meta:
        model = forwards
        # fields = '__all__'
        exclude = ["user", "counterA", "counterB", "shortcodeurl", "uniqueid"]

models.py:

class forwards(models.Model):
    uniqueid = models.AutoField(primary_key=True)
    user = models.CharField(max_length = 150)
    urlA = models.CharField(verbose_name="URL Version A", max_length = 254)
    counterA = models.DecimalField( max_digits=19, decimal_places=0,default=Decimal('0'))
    urlB = models.CharField(verbose_name="URL Version B",max_length = 254)
    counterB = models.DecimalField( max_digits=19, decimal_places=0,default=Decimal('0'))
    timestamp = models.DateTimeField('date created', auto_now_add=True)
    shortcodeurl = models.CharField(max_length = 254)

显示表单如何集成的html片段:

        <form method="post">
            {% csrf_token %}
            {% for field in forwardform %}
                <span>{{ field.label_tag }} </span>
                <p style="color: black">{{ field }} </p>
                {% for error in field.errors %}
                        <p style="color: red">{{ error }}</p>
                {% endfor %}
            {% endfor %}
        <button class="btn btn-outline btn-xl type="submit">Generate URL</button>
        </form>

views.py:

def forwardthis(request):
    forwardform = AddUrlForm(request.POST or None)
    if forwardform.is_valid():
        forward = forwardform.save(commit=False)
        forward.user = request.user.username
        forward = forwardform.save()
        uniqueid_local = forward.uniqueid
        uniqueid_local_bytes = uniqueid_local.to_bytes((uniqueid_local.bit_length() + 7) // 8, byteorder='little')
        shortcodeurl_local  = urlsafe_base64_encode(uniqueid_local_bytes)
        forward.shortcodeurl = shortcodeurl_local
        forward.save()
        return HttpResponseRedirect('/forwardthis')
    query_results = forwards.objects.filter(user=request.user.username)
    query_results_qty = query_results.count()
    click_results = clickstats.objects.filter(user=request.user.username)
    template = loader.get_template('forwardthis.html')
    context = {
        'forwardform': forwardform ,
        'query_results':query_results,
        'query_results_qty': query_results_qty
    }
    return HttpResponse(template.render(context,request))

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    适用于 2021 年来到这里的任何人。

    现在 Django 提供了实现这种验证的工具。

    基于Django 3.2 documentation

    
    from django import forms
    from django.core.exceptions import ValidationError
    
    class AddUrlForm(forms.ModelForm):
    
        class Meta:
            model = forwards
            # fields = '__all__'
            exclude = ["user", "counterA", "counterB", "shortcodeurl", "uniqueid"]
    
        def clean_shortcodeurl(self):
            data = self.cleaned_data['shortcodeurl']
            if "my_custom_example_url" not in data:
                raise ValidationError("my_custom_example_url has to be in the provided data.")
            return data
    

    【讨论】:

      【解决方案2】:

      您可以为每个表单域创建一个验证方法。 def clean_FIELDNAME()。我假设 url 字段是shortcodeurl:

      class AddUrlForm(forms.ModelForm):
      
          def clean_shortcodeurl(self):
              cleaned_data = self.clean()
              url = cleaned_data.get('shortcodeurl')
              if not is_valid_url(url):  # You create this function
                  self.add_error('shortcodeurl', "The url is not valid")
              return url
      
          class Meta:
              model = forwards
              # fields = '__all__'
              exclude = ["user", "counterA", "counterB", "shortcodeurl", "uniqueid"]
      

      【讨论】:

      • 就像一个魅力。在定义 is_valid_url 函数时遇到了一些麻烦,但确实将逻辑 if not shortcodeurl.startswith("http://"): 直接放入内部,而不是使用单独的函数来调用错误。
      猜你喜欢
      • 2011-02-24
      • 2016-04-08
      • 1970-01-01
      • 2019-03-13
      • 2020-11-27
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      相关资源
      最近更新 更多