Django空表单字段验证与清理方法不起作用

2024-04-20 10:30:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个django表单,我想在保存时验证字段是否不为空,例如“description”字段(charfield)……这是我的表单。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

但是什么也没有发生,已经尝试过这样的返回:return self.cleaned_datareturn clean_description但是仍然是一样的。

这是我的视图

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,
                                })  

成本项目模型:

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>

有什么帮助吗?

提前谢谢


Tags: namebrselfdivformfieldverbosevalue
2条回答

des永远不会等于None,默认值至少为空字符串

if not des:应该足够满足des为空时的if语句

如果您真正想检查的是它是否为空,那么您可以在模型中将^{}设置为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,
                                })  

如果试图在模板中显示表单错误,则应将错误传递给模板。在您的情况下,视图应该如下所示。

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")
            form_group = GroupsForm()
            form_subgroup= SubGroupsForm()
            return render(request, self.template_name,{
                            "form_subgroup":form_subgroup,
                            "form_cost_item":form_insert,
                            "form_group":form_group,
                        })   

    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,
                            })  

我可以看到模型中的字段在默认情况下是必需字段。所以无论如何,它会引发验证错误。如果表单如上所述无效,则只需将错误表单传递给模板。

相关问题 更多 >