【问题标题】:Django ModelForm Custom Date FieldDjango ModelForm 自定义日期字段
【发布时间】:2019-10-04 02:02:52
【问题描述】:

我正在尝试创建一个预订表格,该表格在发布表格时为模型预订创建一个对象。我正在使用自定义日期选择器小部件来选择吃的,但我也在使用 ModelForms。

问题是,如果我没有在 forms.py 的元字段列表中列出“日期”,那么表单不会在帖子中查找日期字段表单输入。但是,如果我在 forms.py Modelform 的元字段中包含“日期”,那么它会出错并说“日期字段不能留空”,即使它不是空白的......

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 )

【问题讨论】:

  • 您在if 部分的正文中写了return data,而不是在方法的末尾。
  • 感谢您的输入,您是正确的,解决了问题。
  • no 缩进太多了。如果您查看您引用的文档,return ...def clean_date 下缩进,而不是if
  • 我编辑了回复,谢谢!

标签: django modelform


【解决方案1】:

如果if 条件为False,您的clean_date 方法不会返回值。如果正确,您应该返回清理后的数据,例如:

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")

    # not indented under the if
    return data

否则,如果数据有效,此函数将返回None,如果数据无效,则返回ValidationError

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 2012-05-23
    • 2014-08-05
    • 2016-11-27
    相关资源
    最近更新 更多