【问题标题】:Django form.is_valid giving FalseDjango form.is_valid 给出 False
【发布时间】:2019-04-09 12:38:15
【问题描述】:

ModelsForm 以 ISO 格式返回日期时间,例如:

2019-04-10T06:30:00

views.py 中,我正在检查响应字符串中包含的字符“T”并将 ISO 转换为 python 日期时间格式。此后,我将表单字段替换为新值。
如果字符串仅包含日期 - 2019-04-10event_form.is_valid() 返回 True 并且正在创建新实例。但如果字符串包含时间,is_valid 返回 False。

views.py

def event(request):
    all_events = Events.objects.all()
    if request.method == 'POST':
        event_form = ModelEventsForm(request.POST)
        start = (event_form['start_date'].value())
        end = (event_form['end_date'].value())
        if 'T' in start and end:#Check that time include in data string (for create events from daily and week view)
            start = datetime.strptime(start, "%Y-%m-%dT%H:%M:%S")
            end = datetime.strptime(end, "%Y-%m-%dT%H:%M:%S")
            event_form = ModelEventsForm(initial={'start_date': start, 'end_date': end})
        if event_form.is_valid():
            update = event_form.save(commit=False)
            update.owner = request.user.profile
            update.start_date = event_form.cleaned_data['start_date']
            update.end_date = event_form.cleaned_data['end_date']
            update.save()
        return redirect('events:event')
    else:
        event_form = ModelEventsForm()
    context = {
        "events": all_events,
        'event_form': event_form
    }
    return render(request, 'profile/event_management.html', context)

form.py

 <form method="POST">
              {% csrf_token %}
          <div class="form-group">
            <label for="event_name">Event name</label>
              {%  render_field  event_form.event_name class="form-control" id='event_name' %}

          </div>
             <div class="form-group">
             <label for="start-date">Event start</label>
              {%  render_field  event_form.start_date class="form-control datepicker" id='start-date' %}

          </div>
             <div class="form-group">
            <label for="end-date">Event end</label>
                 {%  render_field  event_form.end_date class="form-control datepicker" id='end-date' %}

          </div>
          <button type="submit" class="btn btn-primary">Создать событие</button>
        </form>

modelforms.py

class ModelEventsForm(forms.ModelForm):
    class Meta:
        model = Events
        exclude = ['event_type', 'owner']

models.py

class Events(models.Model):
    owner = models.ForeignKey(Profile, blank=True, null=True, on_delete=models.CASCADE)
    event_name = models.CharField(max_length=255)
    start_date = models.DateTimeField(null=True)
    end_date = models.DateTimeField(null=True)
    event_type = models.CharField(max_length=10)

startend 值是适当的 python 日期时间格式

2019-04-09 19:00:00

【问题讨论】:

  • 显示您的表单代码
  • @c.grey 代码已经存在问题
  • 不,问题中的代码不是。您需要显示 ModelEventsForm 的定义。在任何情况下,仅使用 initial 数据初始化的表单永远不会有效。
  • Ups,抱歉我添加了新代码
  • 当您执行form = MyForm(initial={...}) 时,您并没有绑定表单(因为dataNone),因此它将无效。 initial 只是在表单绑定之前设置初始值。

标签: python django django-forms


【解决方案1】:

用这段代码做的

def event(request):
    all_events = Events.objects.all()
    if request.method == 'POST':
        event_form = ModelEventsForm(request.POST)
        start = (event_form['start_date'].value())#get datetime string from request
        end = (event_form['end_date'].value())
        #transform string to python datetime
        if 'T' in start and end:
            start = datetime.strptime(start, "%Y-%m-%dT%H:%M:%S")
            end = datetime.strptime(end, "%Y-%m-%dT%H:%M:%S")
        else:
            start = datetime.strptime(start, "%Y-%m-%d")
            end = datetime.strptime(end, "%Y-%m-%d")

        update_request = request.POST.copy()
        update_request.update({'start_date': start, "end_date": end})
        event_form = ModelEventsForm(update_request)
        if event_form.is_valid():
            update = event_form.save(commit=False)
            update.owner = request.user.profile
            update.start_date = event_form.cleaned_data['start_date']
            update.end_date = event_form.cleaned_data['end_date']
            update.save()                
            return redirect('events:event')
    else:
        event_form = ModelEventsForm()
    context = {
        "events": all_events,
        'event_form': event_form
    }
    return render(request, 'profile/event_management.html', context)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 2014-01-10
    • 2020-05-09
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多