2017-12-06 7 views
0

ユーザーはDjangoフォームにデータを入力し、各タイムスロットと1日スロットにつき1つのエントリだけをデータベースに入れようとしています。同じフィールドデータを持つ複数のフォームエントリを防止しようとしています(最初のユーザーがタイムスロットを使用できるようにしてください)

例:ユーザーが午前8時00分の間に話すように「サインアップ」するためにフォームに記入 - スケジュールID 2.

データベースエントリがすでに同じタイムスロットとDAYSLOTで存在している場合のための1日目の午前9時、私はエラーを提起してエントリを防止したい。 ...任意の助けてくれてありがとう

models.py 

from django.db import models 
import datetime 

class Schedule(models.Model): 
    title = models.CharField(max_length=250) 

    def publish(self): 
     self.published_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.title 

class Agenda(models.Model): 

    dayChoice = (
    ('d1', "Day 1"), 
    ('d2', "Day 2"), 
    ('d3', "Day 3"), 
    ('d4', "Day 4") 
    ) 

    fullName = models.CharField(max_length=250) 
    startTime = models.TimeField(auto_now=False, blank=True, null=True) 
    endTime = models.TimeField(auto_now=False, blank=True, null=True) 
    approved = models.BooleanField(blank=True) 
    daySlot = models.CharField(max_length=2, choices=dayChoice) 
    sub_date = models.DateTimeField(auto_now=True) 
    scheduler = models.ForeignKey(Schedule, on_delete=models.CASCADE) 

    def publish(self): 
     self.published_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.fullName 

views.py 
    from django.shortcuts import render, redirect 

    from django.utils import timezone 
    from django.shortcuts import render, get_object_or_404 
    from .models import Schedule, Agenda 
    from .forms import AgendaForm 
    # Create your views here. 

    def schedule_list(request): 
     schedules = Schedule.objects.all() 
     return render(request, 'adjenda/schedule_list.html', {'schedules': schedules}) 

    def agenda_detail(request, pk): 
     schedules = get_object_or_404(Schedule, pk=pk) 
     agenda = Agenda.objects.filter(scheduler_id=pk).order_by('startTime') 
     form = AgendaForm(request.POST) 
     if request.method == "POST": 
      form = AgendaForm(request.POST) 
      if form.is_valid(): 
       post = form.save(commit=False) 
       post.author = request.user 
       post.published_date = timezone.now() 
       post.save() 
       return redirect("/schedule/" + pk) 
     else: 
      form = AgendaForm() 

     return render(request, 'adjenda/schedule_detail.html', {'agenda': agenda, 'schedules': schedules, 'form': form}) 


forms.py 

from django import forms 
from .models import Agenda, Schedule 

class AgendaForm(forms.ModelForm): 

    class Meta: 
     model = Agenda 
     fields = '__all__' 



    def clean_startTime(self): 
     startTime = self.cleaned_data['startTime'] 
     if Agenda.objects.filter(startTime=startTime).exists(): 
      raise forms.ValidationError("Time/Day already taken") 
     return startTime 

ここ

は、私がこれまで持っているものですが、フィルタは、テーブル全体にまたがっだけではなく、スケジュールIDごとにフィルタリングしています!たぶん

答えて

1

unique_togetherは、あなたが探しているものです:

class Agenda(models.Model): 
    # field definiton 

    class Meta: 
     unique_together = ("startTime", "endTime", "daySlot") 
+0

これは私がまさに必要です!私はまた、パラメータとして "スケジューラ"を追加し、完全に働いた。あまりにも多くのギレルモ、ありがとう! – CelineDijon

+0

私はこれも必要です。どこにunique_togetherを追加しますか?ドキュメンテーションはそれに役立つものではありません。 – student101

+0

@ student101 unique_togetherに含めるフィールドを収めているモデルクラスの下のmodels.pyにそれを追加します。 – CelineDijon

関連する問題