2015-09-03 146 views
0

我想創建一個應用程序,我可以爲用戶保存時間戳。現在,我的表單可以正常工作,但我需要確保mul_id在form.save()之前存在於Player表中。我怎樣才能讓我的應用程序執行該操作?Django從數據庫中獲取值form.save()

如果mpr_id不播放顯示錯誤的形式存在

這是我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) 

會明白的H ELP。

+0

AddTimeForm存在對象是PlayerRecordTime的ModelForm。你是否需要檢查播放器記錄中是否也存在mpr_id表單值?如果那爲什麼玩家和PlayerRecordTime之間沒有關係? – joanbm

+0

@JoanBlackmoore因爲我清楚地忘了提,我不那麼專家Django的,當我試圖讓在models.py Player和PlayerRecordTime之間的關係,我的形式產生下拉與名單FO mpr_id的和我不我想要的是,我需要一個TextInput的形式。 –

+0

恩,這可能是問題的一部分。你應該真正閱讀有關可用模型關係的Django文檔並定義一個。這將解決領域重複,包括。 mpr_id。如果mpr_id的類型爲CharField,並且在定義它的模型中使用,則默認情況下,它將使用文本輸入字段來表示,就像您請求的一樣。 – joanbm

回答

0

您可以檢查是否由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 
+0

對不起,我還是不明白。 –

+0

哦,我的壞處應該有更好的解釋。好吧,你使用Players.object.get函數從數據庫中獲取表單的對象mpr_id,如果它不在數據庫函數中引發DoesNotExist異常除了你不保存表單到數據庫的部分,因爲你說你不需要它。如果它不會引發例外情況,則將表單保存到數據庫 – DreadfulWeather

+0

謝謝你,你說的話給了我一點點光。 –