我的模型的属性为' Unique = True 此属性是指负责评估候选人的模型,评估者只能评估一个候选人。因此,当我尝试使用相同的评估者评估候选人时,Django会返回 ValueError ,所以我尝试对待异常,但它不起作用...存在一种特殊的方法来处理Django中的异常?
views.py(位于 def评估):
from django.shortcuts import render, get_object_or_404
from .models import Candidate, Criterion, Evaluation
from django import forms
from .forms import CandForm
from .forms import EvalForm
from django.shortcuts import redirect
def canditate_list(request):
candidates = Candidate.objects.all()
eva = Evaluation.objects.all()
eval_cand_list = [] #aqui guarda uma lista com os FK candidates convertidos p/ str
context = {
'candidates': candidates,
'eva': eva
}
return render(request, 'app/candidate_list.html',context)
def candidate_detail(request, pk):
candidate = get_object_or_404(Candidate, pk=pk)
c_name = candidate.name #pega o nome (string) do candidato
c1 = Evaluation.objects.all() #guarda tds Evaluation na variavel
scores = [] #declara a array que vai receber as notas
for c in c1:
cand = str(c.candidate) #guarda o nome do candidato do Evaluation atual
if cand == c_name: #confere se o Evaluation atual corresponde ao candidate atual(pk)
scores += [c.score]
_sum = 0 #variavel que guardara a soma declarada
for s in scores:
_sum += s #faz a soma dos scores
average = 0
if len(scores) > 0:
average = _sum/len(scores) #tira a média
context = {
'candidate': candidate,
'average': average
}
return render(request, 'app/candidate_detail.html', context)
def evaluation(request):
if request.method == "POST":
try:
form2 = EvalForm(request.POST)
if form2.is_valid():
post = form2.save(commit=False)
post.save()
return redirect('canditate_list')
except ValueError:
return('Você já avaliou este candidato!')
else:
try:
form2 = EvalForm()
return render(request, 'app/evaluation.html', {'criterions': form2,})
except ValueError:
return('Você já avaliou este candidato!')
def register(request):
if request.method == "POST":
form = CandForm(request.POST)
if form.is_valid():
post = form.save(commit=False)
post.save()
return redirect('candidate_detail', pk=post.pk)
else:
form = CandForm()
return render(request, 'app/register.html', {'form': form})
models.py
from django.db import models
from jsonfield import JSONField
from site_.settings import MEDIA_ROOT
from django.core.validators import MaxValueValidator
class Criterion(models.Model):
label = models.CharField(max_length=100)
def __str__(self):
return self.label
class Candidate(models.Model):
name = models.CharField(max_length=100)
e_mail = models.EmailField(max_length=100, default = '')
github = models.URLField(default = '')
linkedin = models.URLField(max_length=100, default = '')
cover_letter = models.TextField(default = '')
higher_education = models.BooleanField(default = False)
average = models.IntegerField(default = 0)
#############################################################score = models.ForeignKey()
docfile = models.FileField(upload_to='/home/douglas/Documentos/Django/my-second-blog/site_/media', null=True, blank=True)
def __str__(self):
return self.name
class Evaluation(models.Model):
candidate = models.ForeignKey(Candidate, unique=True)
criterion = models.ForeignKey(Criterion, default='')
score = models.PositiveIntegerField(default = 0, validators=[MaxValueValidator(10)])
appraiser = models.ForeignKey('auth.User')
def __str__(self):
return str(self.candidate)
[编辑]:
返回的错误是:
ValueError:视图app.views.evaluation没有返回 HttpResponse对象。它改为返回None。
答案 0 :(得分:1)
您获得的错误不是由于未处理ValueError
而是由于未将HTTP响应返回给客户端。错误非常明确:
ValueError: The view app.views.evaluation didn't return an HttpResponse object. It returned None instead.
首先,当您尝试使用unique = True
约束条件将条目保存到数据库时引发的异常是IntegrityError
。
将您的evaluation
视图更改为:
# views.py
from django.db import IntegrityError
def evaluation(request):
# form2 initialization
form2 = EvalForm()
if request.method == "POST":
form2 = EvalForm(request.POST)
if form2.is_valid():
post = form2.save(commit=False)
try:
post.save() # if candidate exists, then IntegrityError will be raised
except IntegrityError:
# Handle error here. Maybe add a message or something
# and pass it though the context
# if its a GET method, form2 will be unbound (ready to filled with data)
# if its a POST method, form2 will be filled with any potential errors
return render(request, 'app/evaluation.html', {'criterions': form2,})