Django形成零星验证

时间:2013-09-24 16:50:19

标签: python django forms validation

我有一个从基于类的通用UpdateView访问的表单。除其他事项外,它验证正在更新的事件与另一个事件的日期不同。

问题是,在更新某些字段时,例如位置,处理更改时不会引发错误,但更新其他更改,例如name,抛出与其他事件发生冲突的事件日期的验证错误,以及编辑位置时也应发生的错误。

为什么编辑某些字段会引发验证错误而不会编辑其他字段?真的,验证应该检查所有。

我的观点:

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    

1 个答案:

答案 0 :(得分:0)

您的代码中有一些错误,可能与您的问题有关,也可能没有。

clean_location中的if语句将始终为false,因为''为false。我想你想要的是:

if name in ["Give short, descriptive name", '']:

其次,在clean_name中也是如此。应该是:

if name in ["Give short, descriptive name", '']:

第三,在clean中,您使用self.request作为用户对象:

user = self.request

应该是:

user = self.request.user

也许这些更改可以解决您的问题。