ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – Django空表单字段验证不适用于clean方法

2019-08-24 08:55:13  阅读:166  来源: 互联网

标签:python validation django django-forms


我有一个django表单,我想验证当我要保存时字段不为空,让我们说例如“description”字段(charfield)….这是我的form.py代码:

from django.core.exceptions import ValidationError

class CostItemsForm(ModelForm):

    groupid = forms.CharField(required=True)

    def __init__(self, *args, **kwargs):
        super(CostItemsForm, self).__init__(*args, **kwargs)

    class Meta:
        model = CostItems
        fields = [
                    'description', 
                    'usd_value', 
                    'rer',
                    'pesos_value', 
                    'supplier', 
                    'position',
                    'observations',
                    'validity_date',
                ]

    def clean_description(self):
        des = self.cleaned_data['description']
        if des==None:
            raise ValidationError("Description cannot be empty")
        return des

但没有任何反应,已经尝试过这样返回:返回self.cleaned_data并返回clean_description但仍然相同.

这是我的view.py:

class CostItemInsert(View):
    template_name='cost_control_app/home.html'

    def post(self, request, *args, **kwargs):
        if request.user.has_perm('cost_control_app.add_costitems'):
            form_insert = CostItemsForm(request.POST)
            if form_insert.is_valid():
                form_save = form_insert.save(commit = False)
                form_save.save(force_insert = True) 
                messages.success(request, "Record created")
            else:
                messages.error(request, "Could not create record, please check your form")
        else:
            messages.error(request, "Permission denied")
        form_group = GroupsForm()
        form_subgroup= SubGroupsForm()
        form_cost_item = CostItemsForm()
        return render(request, self.template_name,{
                                    "form_subgroup":form_subgroup,
                                    "form_cost_item":form_cost_item,
                                    "form_group":form_group,
                                })  

和costitems模型:

class CostItems(ModelAudit):
    cost_item = models.AutoField(primary_key = True, verbose_name = 'Item de costo')
    group = models.ForeignKey(Groups, verbose_name = 'Grupo')
    description = models.CharField(max_length = 100, verbose_name =' Descripcion')
    usd_value = models.IntegerField(verbose_name ='Valor en USD')
    rer = models.IntegerField(verbose_name = 'TRM negociado')
    pesos_value = models.IntegerField(verbose_name = 'Valor en pesos')
    supplier = models.ForeignKey(Suppliers, verbose_name = 'Proveedor')
    position = models.ForeignKey(Positions, verbose_name = 'Cargo')
    observations = models.TextField(max_length = 500, verbose_name = 'Observación')
    validity_date = models.DateField(verbose_name = 'Fecha de vigencia')

    def __str__(self):
        return self.description

    class Meta:
            ordering = ['cost_item']
            verbose_name = 'Item de costos'
            verbose_name_plural = 'Items de costo'

这是我从html模板中的输入按钮调用的模态代码,我调用该视图:

<div class="modal fade bs-example-modal-lg" id="myModals" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Registrar item de costo</h4>
      </div>
      <form method="post" action="{% url 'cost_control_app:cost_item_insert' %}">
      {% csrf_token %}
          <div class="modal-body">
            <br/>
            <div class="row">
                {%include "partials/field.html" with field=form_cost_item.groupid|attr:"readonly:True" %}<br clear="all"/>
                {%include "partials/field.html" with field=form_cost_item.description %}<br clear="all"/>
                {%include "partials/field.html" with field=form_cost_item.usd_value|attr:"value:0"|attr:"id:id_usd_value" %}<br clear="all"/>
                {%include "partials/field.html" with field=form_cost_item.rer|attr:"value:0"|attr:"id:id_rer_value" %}<br clear="all"/>
                {%include "partials/field.html" with field=form_cost_item.pesos_value|attr:"value:0"|attr:"id:id_pesos_value" %}<br clear="all"/>
                {%include "partials/field.html" with field=form_cost_item.supplier %}<br clear="all"/>
                {%include "partials/field.html" with field=form_cost_item.position %}<br clear="all"/>
                {%include "partials/field.html" with field=form_cost_item.observations %}<br clear="all"/>
                {%include "partials/field.html" with field=form_cost_item.validity_date %}<br clear="all"/>
                </br>

            </div>

          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Cerrar</button>
            <button type="submit" class="btn btn-primary">Guardar</button>
          </div>
       </form>
    </div>
  </div>
</div> 

最后,partials / fields.html也是:

{% load widget_tweaks%}
<div class="col-md-10">
    <div class="form-group {% if field.errors %}has-error{% endif %}">
        <label class="col-sm-2 control-label">{% if field.field.required %}{% endif %}{{ field.label }}<label style="color:red">*</label></label>
            <div class="col-sm-10">
                {% if type == 'check' %}
                    {{ field|add_class:"check" }}
                {% elif type == 'radio' %}
                    {{ field|add_class:"radio" }}
                {% else %}                
                    {{ field|add_class:"form-control" }} 
                {% endif %}
            </div>
            {% for error in field.errors %}
                <div class="error_msg">- {{ error }}</div>
            {% endfor %}
    </div>
</div>

有帮助吗?

提前致谢

解决方法:

des never将等于None,默认值至少为空字符串

如果不是des:当des为空时,应该足以满足你的if语句

如果您真正要检查的是否为空,则可以通过将blank设置为False来在模型中执行此操作

description = models.CharField(max_length = 100, blank=False, verbose_name =' Descripcion')

If a field has blank=True, form validation will allow entry of an empty value. If a field has blank=False, the field will be required.

Yeah, but isn’t validation error supossed to show the alert inside the form before user can proceed to save ??

是的,但是在您向用户显示之前覆盖了表单,这可以通过在方法顶部定义表单然后进一步向下覆盖来轻松解决

   def post(self, request, *args, **kwargs):
        form_group = GroupsForm()
        form_subgroup= SubGroupsForm()
        form_cost_item = CostItemsForm()
        if request.user.has_perm('cost_control_app.add_costitems'):
            form_cost_item = CostItemsForm(request.POST)
            if form_cost_item.is_valid():
                form_save = form_cost_item.save(commit = False)
                form_save.save(force_insert = True) 
                messages.success(request, "Record created")
            else:
                messages.error(request, "Could not create record, please check your form")
        else:
            messages.error(request, "Permission denied")
        return render(request, self.template_name,{
                                    "form_subgroup":form_subgroup,
                                    "form_cost_item":form_cost_item,
                                    "form_group":form_group,
                                })  

标签:python,validation,django,django-forms
来源: https://codeday.me/bug/20190824/1706388.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有