我试图让用户以django形式输入数据,并且每个时段和每个时段只允许一次进入数据库。
示例:用户填写表单以“注册”在第1天的上午8:00 - 上午9:00发言以获取时间表ID。
如果已存在具有相同TIMESLOT和DAYSLOT的数据库条目,我想引发错误并阻止输入。
这是我到目前为止所做的,但过滤器跨越整个表而不是仅按照计划ID进行过滤......
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
感谢您的帮助!
答案 0 :(得分:1)
也许unique_together正是您所寻找的:
class Agenda(models.Model):
# field definiton
class Meta:
unique_together = ("startTime", "endTime", "daySlot")