尝试阻止具有相同字段数据的多个表单条目(仅允许第一个用户进行时间段)

时间:2017-12-06 22:42:59

标签: python django django-models django-forms django-views

我试图让用户以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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

也许unique_together正是您所寻找的:

class Agenda(models.Model):
    # field definiton

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