为什么我的Django表单未显示任何验证错误?

时间:2020-02-23 11:46:45

标签: python django

我在Django中有一个表单字段,名为weight,它以整数作为输入。但是,我想在允许用户发布数据之前先验证数据。与此相反,如果用户输入错误的数据(0或10以外的值),则我不会引发验证错误。显然我出了点问题。但是,我无法弄清楚,如果有人花宝贵的时间来查看我的代码,那将是一个很大的帮助。另外,我相信我可以在编写更简洁的代码方面获得更好的见解。

这是我的模型。py

class Issue(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
updated_by_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='issue_updated_by', blank=True)
updatd_time = models.DateTimeField(auto_now=True)
created_by_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='issue_created_by')
created_on = models.DateTimeField(auto_now_add=True)
title = models.CharField(max_length=256)
description = models.TextField(blank=True, null = True)
open = models.BooleanField(default=True)
start_date = models.DateField(null=True, blank=True)
due_date = models.DateField(null=True, blank= True)
restrict_access = models.BooleanField(default=False)
project = models.ForeignKey(Project,on_delete=models.CASCADE, related_name='project_issue')
weight = models.IntegerField(blank=True, default= None, null= True, validators=[MinValueValidator(0), MaxValueValidator(10)])

这是我的表格。py

IssueForm(forms.ModelForm):
title = forms.CharField(label='Title', required=True)
description = forms.CharField(label='Description',required = False, widget=forms.Textarea)
due_date = forms.DateTimeField(initial=datetime.date.today,
                                 input_formats=['%d/%m/%Y'],
                                 widget=forms.DateTimeInput(
                                     attrs={
                                         'class': 'form-control datetimepicker-input',
                                         'data-target': '#datetimepicker2'
                                     }),required=False,
                                 )
restrict_access = forms.BooleanField(label='Restrict access',required=False)
weight = forms.IntegerField(required=False, validators=[MaxValueValidator(10),MinValueValidator(0)])

class Meta:
    model = Issue
    fields = ['title','description','start_date','due_date','restrict_access','weight']

def clean_weight(self,*args,**kwargs):
    weight = self.cleaned_data.get('weight')
    if weight is not None:
        if weight > 10:
            raise forms.ValidationError(_('Number must be less than 10'))
        elif weight < 0:
            raise forms.ValidationError(_('Number must be greater than 0'))
        else:
            return weight

这是我的views.py(忽略缩进,我在发布时遇到了麻烦。)

@login_required
def create_issue(request, id):
    project = Project.objects.get(pk=id)
    form1 = IssueForm
    form2 = IssueAttachmentForm
    form3 = IssueAssigneeForm
    context = {}
    context.update(csrf(request))
    context ['issue_form'] = form1(prefix='form1')
    context ['attachment_form'] = form2(prefix='form2')
    context ['assinee_form'] = form3(prefix='form3')
    context ['project'] = project

    if request.method == 'POST':
        form1 = form1(request.POST, prefix='form1')
        form2 = form2(request.POST, prefix='form2')
        form3 = form3(request.POST, prefix='form3')

        if form1.is_valid() and form2.is_valid() and form3.is_valid():
            issue = form1.save(commit=False)
            issue.project = project
            issue.created_by_user = request.user
            issue.updated_by_user = request.user
            issue.save()
            attachment = form2.save(commit=False)
            attachment.issue = issue
            attachment.updated_by_user = request.user
            attachment.save()
            assignee = form3.save(commit=False)
            assignee.issue = issue
            assignee.save()
            assignees_members = request.POST.getlist('form3-assignees')
            assignee.assignees.add(*assignees_members)
            return redirect('base:project_detail', id=id)

      elif form1.is_valid() and form2.is_valid() and form3.is_valid():
            issue = form1.save(commit=False)
            issue.project = project
            issue.created_by_user = request.user
            issue.updated_by_user = request.user
            issue.save()
            attachment = form2.save(commit=False)
            attachment.issue = issue
            attachment.updated_by_user = request.user
            attachment.save()
            assignee = form3.save(commit=False)
            assignee.issue = issue
            assignee.save()
            assignees_members = request.POST.getlist('form3-assignees')
            assignee.assignees.add(*assignees_members)
            return redirect('base:project_detail', id=id)

      elif form1.is_valid() and form2.is_valid():
            issue = form1.save(commit=False)
            issue.project=project
            issue.created_by_user = request.user
            issue.updated_by_user = request.user
            issue.save()
            attachment = form2.save(commit=False)
            attachment.issue = issue
            attachment.updated_by_user = request.user
            attachment.save()
            return redirect('base:project_detail', id = id)
      elif form1.is_valid():
            issue = form1.save(commit=False)
            issue.project=project
            issue.created_by_user = request.user
            issue.updated_by_user = request.user
            issue.save()
            return redirect('base:project_detail', id = id)


    return render(request,'projects/create_issue_template.html',context)
{% extends 'base.html' %}

{% block content %}
<style>
    body {
        font-family: "Roboto", sans-serif;
        font-size: 18px;
    }

    .head_text {
        color: white;
    }

    .card {
        box-shadow: 0 16px 48px #E3E7EB;
         margin: 0 auto;
          float: none;
           margin-bottom: px;
    }
</style>

{% load crispy_forms_tags %}

<div class="col-md-4 card mb-4  mt-3 ">
      <div class="card-body">
        <h1>Create Issue</h1>
        <form method="post" style="margin-top: 1.3em;">
          <p>Title: {{ issue_form.title }}</p>
          <p>Description:</p>
          <p>{{ issue_form.description}}</p>
            <div class="input-group date" id="datetimepicker2" data-target-input="nearest">
            Due Date:     {{ issue_form.due_date }}
  <div class="input-group-append" data-target="#datetimepicker2" data-toggle="datetimepicker">
    <div class="input-group-text"><i class="fa fa-calendar"></i></div>
  </div>
</div>

          <p>Restrict Access{{ issue_form.restrict_access }}</p>
          <p>Issue weight{{ issue_form.weight }}</p>


            {{ attachment_form | crispy }}
            {{ assinee_form | crispy }}

          {% csrf_token %}
          <button type="submit" class="btn btn-primary  btn-lg" style="margin-left:auto;margin-right:auto;display:block;margin-top:5%;margin-bottom:0%">Create</button>
        </form>
           <a href="{% url 'base:project_detail' project.project_id %}"  style="text-align: right;
    float: right;">Issues</a>
      </div>
    </div>


<script>
$(function () {
    $("#datetimepicker2").datetimepicker({
      format: 'DD/MM/YYYY',
    });
  });
  </script>


{% endblock %}

0 个答案:

没有答案
相关问题