Django:表单中的多个日期字段,允许空白输入问题

时间:2011-01-10 21:13:40

标签: django django-forms

我在Django中有一个模型允许两个日期字段的空白:

class ReleaseStream(models.Model):
    name = models.CharField(max_length=200,db_column='name')
    version = models.CharField(max_length=20,blank=True,db_column='version')
    target_date = models.DateTimeField(null=True,blank=True,db_column='target_date')
    actual_date = models.DateTimeField(null=True,blank=True,db_column='actual_date')
    description = models.TextField(db_column='description')

...和表单定义:

class ReleaseStreamForm(ModelForm):

    class Meta:
        model = ReleaseStream

当表单出现时,我可以填写“target_date”的值,而不是“actual_date”字段,当form.save()触发时,它似乎写入为“target_date”提供的值进入这两个领域。我查看了发布到form.save()的代码中的post数据,它肯定有“target_date”的值和'for for“actual_date”的值,所以我不认为有一些奇怪的东西表单本身,POST中的变量名等。

现在,如果我为“actual_date”提供非空值,则form.save()会做正确的事 - “target_date”和“actual_date”都写入了正确的值。我做错了什么,或者这可能是django中的一个错误?

这是模板(对不起下面的空白评论:)

{% extends "base.html" %}

{% block title %}{{ form_title }}{% endblock %}
{% block subtitle %}{% endblock %}

{% block content %}

    <form action={{ action_url }} method="post">
        <table>
        {{ form.as_table }}
        </table>
        <input type="submit" value="Submit" />
    </form>

{% endblock %}

处理表单的代码:

def edit_release_stream(request,req_release_stream_id=None):
    form_title = 'Edit release stream'
    if request.method == 'POST':
        if req_release_stream_id!=None:
            release_stream_entry=ReleaseStream.objects.get(pk=req_release_stream_id)
            form = ReleaseStreamForm(request.POST,instance=release_stream_entry)
        else:
            form = ReleaseStreamForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/releases/')
    elif req_release_stream_id!=None:
        release_stream_entry=ReleaseStream.objects.get(pk=req_release_stream_id)
        form = ReleaseStreamForm(instance=release_stream_entry)        
    else:
        form_title = 'Add new release stream'
        form = ReleaseStreamForm()

    return render_to_response('dashboard/tableform.html', {
        'action_url': request.get_full_path(),
        'form_title': form_title,
        'form': form,
    })

......帖子数据进来了:

<QueryDict: {u'name': [u'NewRelease'], u'target_date': [u'2011-06-15 00:00'], u'version': [u'4.5.1'], u'actual_date': [u''], u'description': [u'']}>

你可以看到它有一个有效的POST变量“actual_date”,带有一个空字符串。这篇文章产生了一个form.save(),它为“target_date”和“actual_date”存储了上面为“target_date”提供的字符串。

如果我然后为两个日期运行一个具有不同值的帖子 - 这是帖子:

<QueryDict: {u'name': [u'NewRelease'], u'target_date': [u'2011-06-15 00:00'], u'version': [u'4.5.1'], u'actual_date': [u'2011-07-15 00:00'], u'description': [u'']}>

在这种情况下,使用两个不同的非空字符串,它会将上面POST中显示的正确值写入db中的每个字段。

1 个答案:

答案 0 :(得分:0)

我不相信它是Django中的一个错误,或者很久以前有人会看到这个问题。你能告诉我们呈现表格的模板吗?此外,如果您可以显示request.POST的内容,那也很有用。

我猜你的模板代码不正确。我能想到的唯一其他问题是表单中的自定义验证(如果有的话)。这是你提供的整个ModelForm定义吗?