Как добавить условие, чтобы форма действовала в django - PullRequest
0 голосов
/ 09 января 2019

Введение: я создаю приложение для событий, я хочу, чтобы пользователь выбирал дату от 3 дней с сегодняшнего дня до максимум 30 дней с сегодняшнего дня

class CreateEvent(IsVerifiedMixin, CreateView):
    model = Event
    form_class = EventForm
    template_name = 'event/event_form.html'

    def form_valid(self, form, *args, **kwargs):
        self.object = form.save(commit=False)
        event = self.object
        today = datetime.date.today()
        user = self.request.user
        if today + datetime.timedelta(days=3) <= event.date <= today + datetime.timedelta(days=30):    
            event.user = self.request.user
            event.initial_stock = event.stock
            slug = self.kwargs['slug']                    
            event.save()                
        else: #I know the below line of code is wrong. How do I fix this
            messages.error(self.request, "The event date has to be equal or more than 3 days away and less than 30 days")    
        return super().form_valid(form)

Вышеприведенное дает мне IntegrityError, если дата выключена, если дата правильная, объект создан. Я просто хочу получить ошибку формы и не переходить на следующую страницу

Ниже приведен form.py для этого

class EventForm(forms.ModelForm):
    price = forms.DecimalField(decimal_places=2, max_digits=5)
    stock = forms.IntegerField()

    class Meta:
        model = Event
        fields = ('price', 'stock', 'date', 'time_from', 'time_to', 'lat', 'lon')

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Добавьте чистую функцию к вашей ModelForm:

def clean(self):
    time_from = self.cleaned_data.get('time_from')
    time_to = self.cleaned_data.get('time_to')
    if #implement your logic:
        raise forms.ValidationError("Validation msg")
    return self.cleaned_data
0 голосов
/ 09 января 2019

Это было простое исправление https://docs.djangoproject.com/en/1.11/ref/forms/api/#django.forms.Form.add_error

if today + datetime.timedelta(days=3) <= event.date <= today + datetime.timedelta(days=30):
    ...
    return super().form_valid(form)

else:
    form.add_error(field="date", error="The date has to be more than or equal to 3 days and less than 30 days")
    return super().form_invalid(form)
...