2017-12-06 4 views
0

사용자가 장고 양식에 데이터를 입력하고 각 시간 슬롯 및 하루 슬롯 당 하나의 항목 만 데이터베이스에 입력하도록하려고합니다.동일한 필드 데이터를 가진 다중 양식 항목을 방지하려고 시도 함 (첫 번째 사용자가 시간 슬롯을 사용할 수 있음)

예 : 사용자 오전 8시 말을 "가입"할 양식을 채우고 - 일정 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

관련 문제