Django 在 form.save() 之前从 db 获取值

Django get value from db before form.save()

我正在尝试创建一个可以为用户保存时间戳的应用程序。现在,我的表单现在可以工作了,但我需要确保 mpr_id 在 form.save() 之前存在于 Player table 中 我怎样才能让我的应用程序做到这一点?

如果 mpr_id 不存在于 Player 中,则在表单中显示错误

这是我的 forms.py:

from django import forms
from .models import PlayerRecordTime

class AddTimeForm(forms.ModelForm):
    class Meta:
        model = PlayerRecordTime
        fields = ['mpr_id']

models.py:

class Player(models.Model):
    mpr_id = models.CharField(verbose_name="MPR ID", max_length=3,     editable=True, unique=True)
    full_name = models.CharField(verbose_name="Nombre Completo", max_length=200, editable=True)
    phone = models.CharField(verbose_name="Telefono", max_length=10, editable=True)
    email = models.EmailField(verbose_name="Email", editable=True)

class Meta:
    verbose_name = "Jugador"
    verbose_name_plural = "Jugadores"
    ordering = ['mpr_id']

def __unicode__(self):
    return self.mpr_id


class CheckPoint(models.Model):
id = models.IntegerField(verbose_name="ID", unique=True, editable=False, primary_key=True)
place_name = models.CharField(verbose_name="Nombre Lugar", max_length=60, editable=True, default=True, unique=True)

class Meta:
    verbose_name = "CheckPoint"
    verbose_name_plural = "CheckPoints"

def __unicode__(self):
    return self.place_name


class PlayerRecordTime(models.Model):
mpr_id = models.CharField(verbose_name="MPRID", max_length="3", editable=True)
place_name_id = models.CharField(verbose_name="Check Point ID", max_length=1)
check_in_time = models.TimeField(verbose_name="CheckIn Time", auto_now=True)

class Meta:
    verbose_name = "Tiempo"
    verbose_name_plural = "Tiempos"
    unique_together = ('mpr_id', 'place_name_id')

def __unicode__(self):
    return self.mpr_id

views.py

def cp(request, cpid, template_name):
title = "ScavengerRun - CP%s" % cpid
head = "Check Point %s" % cpid

form = AddTimeForm()

if request.method == "POST":
    form = AddTimeForm(request.POST)
    form.instance.place_name_id = cpid
    if form.is_valid():
        try:
            form.save()
            form = AddTimeForm()
        except IntegrityError:
            form.errors["mpr_id"] = ["Ya existe un record"]
    else:
        pass

context = {
    "title": title,
    "head": head,
    "form": form,
    "cpid": cpid
}
return render(request, template_name, context)

感谢您的帮助。

您可以通过 get() 函数检查对象是否存在

if request.method == "POST":
form = AddTimeForm(request.POST)
form.instance.place_name_id = cpid
if form.is_valid():
    try:
        plyr = Players.objects.get(mpr_id == form.cleaned_data["mpr_id"])
        form.save()
        form = AddTimeForm()
    except IntegrityError:
        form.errors["mpr_id"] = ["Ya existe un record"]
    except DoesNotExist:
        //does not save
else:
    pass