Django ModelForm Пользовательское поле даты - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь создать форму бронирования, которая создает объект для модели бронирования при публикации формы. Я использую пользовательский виджет для выбора даты, но я также использую ModelForms.

Проблема в том, что, если у меня нет «даты», указанной в списке мета-полей в forms.py, то форма не ищет входные данные поля даты в записи. Но если я добавлю 'date' в мета-поля formform формы Form.py, то он выдаст ошибку и скажет, что "поле даты нельзя оставлять пустым", даже если оно не пустое ...

forms.py

class ReservationForm(forms.ModelForm):

    date = forms.DateField(
        widget=DatePickerInput(format='%m/%d/%Y')
        )
    def clean_date(self):
        data = self.cleaned_data['date']

        # Check if a date is not in the past.
        if data < datetime.date.today():
            raise ValidationError(_('Invalid date - reservation in past'), code='invalid')
            messages.danger(request, "Reservation Created")
            print('ERROR')


            # Remember to always return the cleaned date.
            return data

    class Meta:
        model = Reservation
        fields = ('reservation_time', 'people', 'name', 'email', 'phone') # REMOVED 'date'

views.py

def reservationFormView(request):
    #reservation = create(Reservation)
        # If this is a POST request then process the Form data
    if request.method == 'POST':
        # Create a form instance and populate it with data from the request (binding):
        form = ReservationForm(request.POST)

        # Check if the form is valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required

            reservation = form.save(commit=False)
            reservation.ReservationEmail = form.cleaned_data['email']
            reservation.ReservationName = form.cleaned_data['name']
            reservation.ReservationPeople = form.cleaned_data['people']
            reservation.ReservationTime = form.cleaned_data['reservation_time']
            reservation.date = form.cleaned_data['date']
            print( reservation.date)
            #reservation.created_time = timezone.now()
            reservation.save()

                # redirect to a new URL:
            return HttpResponseRedirect('/reservation-confirmation/')

        # If this is a GET (or any other method) create the default form.
    else:
        form = ReservationForm()

    return render(request, 'home/reservation_form.html', {'form': form, })

models.py

class Reservation(BaseModel):
    class Meta:
        verbose_name_plural = "Reservations"

    TIME_CHOICES = (
...
    )
    SEATING_CHOICES = (
...
    )
    date = models.DateField(null=True)
    name = models.CharField(max_length=35, null=True)
    phone = PhoneNumberField(null=True)   #USE THIS https://github.com/stefanfoulis/django-phonenumber-field
    email = models.EmailField(null=True)
    people = models.PositiveSmallIntegerField(choices=SEATING_CHOICES, default=None, db_index=True)
    reservation_time = models.PositiveSmallIntegerField(choices=TIME_CHOICES, default=None, db_index=True)

    def __str__(self):
        return '(%s) %s %s' % (self.date, self.name, self.phone )

1 Ответ

1 голос
/ 16 мая 2019

Ваш clean_date метод не возвращает значение, если условие if равно False. Вы должны вернуть очищенные данные, если они верны, например:

def clean_date(self):
    data = self.cleaned_data['date']

    # Check if a date is not in the past.
    if data < datetime.date.today():
        raise ValidationError(_('Invalid date - reservation in past'), code='invalid')
        messages.danger(request, "Reservation Created")

    # <i>not</i> indented under the if
    <b>return data</b>

В противном случае эта функция вернет None, если данные верны, и увеличит значение ValidationError, если данные недействительны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...