【问题标题】:can't raise ValidationError django validators无法引发 ValidationError django 验证器
【发布时间】:2020-10-14 09:25:11
【问题描述】:

我需要知道如何在 django 中引发验证器的 ValidationError。

首先我在简单的页面和表单中尝试了表单上的方法,并且效果很好。

但是当我在页面中使用模态淡入淡出类与 pk 一起使用时会出现问题

例如(127.0.0.1:8000/wsheets/AMA2/)。

消息是 (视图 Home.views.wellsets 没有返回 HttpResponse 对象,而是返回了 None。)

mt views.wellsets 是

def wellsets(request, WeelN):
    serchedWl = WellSheets.objects.filter(WellID__exact=WeelN)
    form= WelshetForm()
    context ={
        'title': 'SearchWS',
        'Wellslistsh':serchedWl,
        'WeelN':WeelN,
        'form':form,
    }
    if request.method == 'POST':
        form =WelshetForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.author = request.user
            form.save()
            return redirect('WellSheetg', WeelN)
    else:
        return render(request,'Home/WELLINFO/W_TchD/wellshts.html', context)

我的表单+验证器是:

from django.core.exceptions import ValidationError
class WelshetForm(forms.ModelForm):
    WellID   = forms.CharField(label='Well Name',max_length=15)
    FileNm   = forms.CharField(label='File Name',max_length=15)
    def clean_SHRPath(self):
        SHRPath = self.cleaned_data.get('SHRPath')
        size= SHRPath._size
        if SHRPath._size > 1024*1024*10:
            raise forms.ValidationError('Size is bigger than allowed')           
        return SHRPath

最后这是我的html表单

<button type="button" class="btn button1 btn-outline-success mb-2 btn-block"  data-toggle="modal" data-target="#myModal" >
<p class="thicker">Add new Well-Sheet</p></button>

<div class="modal fade" id="myModal" role="dialog" >
  <div class="modal-dialog ">
    <div class="modal-content">
      <div class="modal-header">
        <h4 class="modal-title"><p class="thicker">Upload Well-sheet</p></h4>
          <button type="button" class="close" data-dismiss="modal">&times;</button>
      </div>

<div class="modal-body">
  <p class="thicker">Check your file before uploading ({{WeelN}})</p>
<div class="w3-panel w3-light-grey w3-round-large solid"">
  <form method="POST" id="formOne" enctype= multipart/form-data>
    {% csrf_token %}

      <div class="form-row">    
        <div class="form-group col-md-6 mb-0">
          {{ form.WellID|as_crispy_field }}  </div></div>      

      <div class="form-row">    
        <div class="form-group col-md-8 mb-0">
        {{ form.SHRPath }}</div></div>
        <p style="color:red;">Maximum upload size is 10Mb</p>
        <br>
      <input class="btn btn-success mb-6" name="form_uplod" type="submit" value="AddSheet">     
  </form>
</div>
    </div>
  </div>
    <div class="modal-footer">
    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button></div>
</div>
</div>

Modal form

【问题讨论】:

  • if form.is_valid(): 正在返回 False 但在这种情况下没有返回任何内容。最简单的解决方案是在视图的最后一行之前删除else:,以便您始终返回响应。

标签: django validation django-forms validationerror raiserror


【解决方案1】:

正如@IainShelvington 所说,您需要删除 else 块才能获得响应。你可以这样尝试:

def wellsets(request, WeelN):
    serchedWl = WellSheets.objects.filter(WellID__exact=WeelN)
    form= WelshetForm()
    if request.method == 'POST':
        form =WelshetForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.author = request.user
            form.save()
            return redirect('WellSheetg', WeelN)
    context ={
        'title': 'SearchWS',
        'Wellslistsh':serchedWl,
        'WeelN':WeelN,
        'form':form,
    }
    return render(request,'Home/WELLINFO/W_TchD/wellshts.html', context)

这样,即使验证失败,您也会收到包含错误数据的表单响应。要在模板中显示表单错误,请尝试如下:

<div class="form-group col-md-8 mb-0">
{{ form.SHRPath }}</div>
{% if form.SHRPath.errors|length > 0 %}
    <p style="color:red;">{{ form.SHRPath.errors.0 }}</p>
    <br>
{% endfor %}

更多信息可以在documenation找到。

【讨论】:

  • 我正常情况下它工作正常,但不能渲染或提升到
  • 我只是将 {% endfor %} 更改为 {% endif %} :) 它工作并说(没有提交文件。检查表单上的编码类型。)但是引导模式关闭了,我重新打开它以查看此消息。非常感谢
  • 太棒了!那么请考虑将其标记为accepted。谢谢。
【解决方案2】:

嗨,事实上我是通过其他方式做到的 提交时引导模式中没有出现错误消息,但它工作正常。 在我的 views.py 中,我创建了一个新表单(form_error):

def wellsets(request, WeelN):
    serchedWl = WellSheets.objects.filter(WellID__exact=WeelN)
    form= WelshetForm()
    form_error = False
    if request.method == 'POST':
        form =WelshetForm(request.POST, request.FILES)
        if form.is_valid():
            form.instance.author = request.user
            form.save()
            return redirect('WellSheetg', WeelN)
        else:
            form_error = 'Check your file Name, type and size <10Mb'
            
    context ={
        'title': 'SearchWS',
        'Wellslistsh':serchedWl,
        'WeelN':WeelN,
        'form':form,
        'form_error': form_error,
    }
    return render(request,'Home/WELLINFO/W_TchD/wellshts.html', context)

在我的 HTML 中:

      {% if form %}
<div class="w3-panel w3-light-grey w3-round-large solid"">
  <form method="POST" id="formOne" enctype= multipart/form-data>
    {% csrf_token %}
      <div class="form-row">    
        <div class="form-group col-md-6 mb-0">
          {{ form.WellID|as_crispy_field }}</div></div>
          {% if form_error %}
            <li style="color:red;"><strong>Check the Well if it does exist</strong></li>
          {% endif %}
     
      <div class="form-row">    
        <div class="form-group col-md-6 mb-0">
        {{ form.FileNm|as_crispy_field }}</div></div>
      <div class="form-row">    
        <div class="form-group col-md-6 mb-0">
        {{ form.Folio|as_crispy_field }}</div></div>
      
      <div class="form-row">    
        <div class="form-group col-md-8 mb-0">
        {{ form.SHRPath }}</div></div>
        {% if form_error %}
            <li style="color:red;"><strong>{{form_error}}</strong></li>
            <li style="color:red;"><strong>File type (pdf, jpg ,xls..) only accepted</strong></li>
        {% endif %}
        <p style="color:red;">Maximum upload size is 10Mb</p>
        <br>
      <input class="btn btn-success mb-6" data-target="#myModal" name="form_uplod" type="submit" value="AddSheet"> 

    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>    
  </form>
  {% endif %}

我创建了一个 validators.py 并在其中:

    def validate_file_size(value):
    filesize= value.size
    print('very nice',filesize/(1024*1024))
    if filesize > 1024*1024*10:
        raise ValidationError(_("The maximum file size that can be uploaded is 10MB"), code='invalid')
    return value


def validate_text(value):
    from Home.models import Wellinfo
    WELDATA= Wellinfo.objects.filter(WellID=value)
    print(value, WELDATA)
    if Wellinfo.objects.filter(WellID=value).exists():
        return value
    raise ValidationError("The Well does't exists!")

最后在 model.py 中我将装饰器称为;

class WellSheets(models.Model):
    WellID      = models.CharField(max_length=15, validators= [validate_text])
    FileNm      = models.CharField(max_length=15)
    Folio       = models.PositiveIntegerField(blank=True, null=True)
    SHRPath     = models.FileField(upload_to='Well_sheets/', validators= [validate_file_size])

最后,文件不会添加或上传,当我进入模态窗口时,我看到了 Description of modal window

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签