У меня есть поле формы в Django с именем weight, которое принимает целое число в качестве входных данных. Тем не менее, я хочу проверить данные, прежде чем позволить пользователю опубликовать их. В отличие от этого, я не могу вызвать ошибку проверки, если пользователь вводит неверные данные (значение за пределами 0 или 10). Очевидно, я что-то не так понял. Однако я не могу понять это, было бы очень полезно, если бы кто-то потратил свое драгоценное время на просмотр моего кода. Кроме того, я верю, что смогу лучше понять, как написать более чистый код.
Это мои models.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)])
Это мои forms.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 %}