0

クラスベースのジェネリック UpdateView からアクセスするフォームがあります。とりわけ、更新されているイベントが別のイベントと同じ日付ではないことを検証します。

問題は、場所などの一部のフィールドを更新すると、エラーが発生することなく変更が処理されますが、名前などの他のフィールドを更新すると、イベントの日付が別のイベントと衝突することに関する検証エラーがスローされることです。編集されます。

一部のフィールドを編集すると検証エラーが発生し、他のフィールドを編集しないのはなぜですか? 実際、検証ではそれらすべてをチェックする必要があります。

私の見解:

class EventEditView(UpdateView):
    template_name = "edit_event.html"
    pk_url_kwarg='event_id'
    model = Event
    form_class = EventEditForm

このフォームを使用します:

class EventEditForm(forms.ModelForm):

    class Meta:
        model = Event

    def __init__(self, *args, **kwargs):
        self.request = kwargs.pop('request', None)
        super(EventEditForm, self).__init__(*args, **kwargs)


    name = forms.CharField(max_length=1024,
        initial="Give short, descriptive name")
    location = forms.CharField(max_length=1024,
        initial="Be specific, give online map link")
    dateTimeOptions = {
        'format': 'dd/mm/yyyy HH:ii P',
        'autoclose': 'true',
        'showMeridian': 'true',
        }
    date = forms.DateTimeField(label="Date and time",
        widget=DateTimeWidget(options=dateTimeOptions,
        attrs={'id':"date-time"}))
    host_act = forms.CharField(max_length=1024,
        initial="What act will you bring, if any?", required=False)
    description = forms.CharField(required=False, max_length=10240)

    def clean_location(self):
        cd = self.cleaned_data
        location = cd.get('location')
        if location == "Be specific, give online map link" or '':
            raise forms.ValidationError("Please enter a location")
        return location

    def clean_name(self):
        cd = self.cleaned_data
        name = cd.get('name')
        other_names = Event.objects.proposed(datetime.now)
        if name == "Give short, descriptive name" or '':
            raise forms.ValidationError("Please enter a name")
        return name

    def clean(self):
        """
        Check that there is not another event on at
        the same time and place. Then check that user has not committed
        to another event on the same date, even somewhere else.
        """
        cleaned_data = super(EventEditForm, self).clean()
        event_start_estimate = cleaned_data.get("date") - timedelta(hours=3)
        event_end_estimate = event_start_estimate + timedelta(hours=7)
        location = cleaned_data.get("location")
        events_on_date = Event.objects.\
            filter(date__range=[event_start_estimate,event_end_estimate])
        events_at_location_on_date = events_on_date.filter(location=location)
        # Check event clash is not this event clashing with itself
        #        events_with_same_date_and_location_id = events_at_location_on_date.values()[0]['id']
        #        this_event_id = self.instance.id
        try:
            if events_with_same_date_and_location_id == this_event_id:
                events_at_location_on_date = False
        except:
            pass
        if events_at_location_on_date:
            raise forms.ValidationError("There is already an event on \
                this date.")
        user = self.request
        print user
        events_on_date_user_has_commit = events_on_date.filter(host__exact=user)
        if events_on_date_user_has_commit:
            raise forms.ValidationError("You are already committed to an event\
                on this date.")
        return cleaned_data    
4

1 に答える 1