【问题标题】:How to make Django's DateTimeField optional?如何使 Django DateTimeField 可选?
【发布时间】:2012-07-05 19:55:24
【问题描述】:

我正在尝试实现一个待办事项列表网站来练习使用 Django。在models.py 中,我有一个名为Item 的类来表示一个待办事项。在其中,我有以下行:

due_date = models.DateTimeField(required=False)

due_date 是一个可选字段,以防用户对某些待办事项有截止日期。问题是由于意外的关键字参数“必需”,上面的行给了我一个TypeError。

所以,我似乎不能为DateTimeField 使用关键字参数“必需”。有什么办法可以让DateTimeField 成为可选的吗?或者我遇到的问题有标准实现吗?

【问题讨论】:

  • required 仅适用于 form 字段。模型字段使用blank=True,它必须与null=True 组合为DateTimeField,以便允许为数据库中的列存储NULL 值。否则,你会得到一个IntegrityError。

标签: python django


【解决方案1】:

"required" 是 Django 表单的有效参数。对于模型,您需要关键字 args blank=True(用于管理员)和 null=True(用于数据库)。

【讨论】:

  • 啊,所以我把表格和模型弄混了。哎呀。
  • 感谢您解释required、blank 和null 之间的区别。
  • IIRC blank=True, null=True 不建议用于文本字段,因为这样您可以有两个“空值”:'' 和 NULL,但这不适用于日期类型的字段吗?跨度>
  • 在文本字段中避免 NULL 确实更好,对于不应接受空字符串作为有效值的日期/日期时间字段来说确实不同。
  • 我一直认为blank=True暗示null=True
【解决方案2】:

使用 due_date = models.DateTimeField(null=True, blank=True)

查看Field Options了解更多信息。

【讨论】:

  • 我们还需要添加required=False,还是这两个就足够了?加不加有什么区别?
  • @halilpazarlama 您的模型字段中不需要required=False,而且它甚至不是模型字段定义中的有效关键字参数。 required=* 可以在表单字段中使用,如果您的模型字段定义中已经有 blank=True,您仍然不需要。
  • 哦。我应该更彻底地阅读其他答案。不过谢谢:)
【解决方案3】:

在保存表单之前,您需要将日期字段设置为无。它对我有用

class ActividadEdit(SuccessMessageMixin, UpdateView ):
model = Ges_Actividad
form_class = GestionActividadesUpdateForm
template_name = 'seguimiento_formula/actividades_seguimiento_update.html'

def post(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    self.object = self.get_object()
    id_actividad = kwargs['pk']
    instancia_nivel = self.model.objects.get(id=id_actividad)
    form = self.form_class(request.POST, instance=instancia_nivel)
    id_usuario_actual = self.request.user.id  # obtiene id usuario actual

    try:
        periodo_actual = Glo_Periodos.objects.get(id_estado=1)
    except Glo_Periodos.DoesNotExist:
        return None

    try:
        id_jefatura = Ges_Jefatura.objects.get(Q(id_user=id_usuario_actual) & Q(id_periodo=periodo_actual.id))
    except Ges_Jefatura.DoesNotExist:
        return None

    try:
        usuario_controlador = Ges_Controlador.objects.get(id_jefatura=id_jefatura.id)
    except Ges_Controlador.DoesNotExist:
        return None
   #**before you save the form you need to set the datefields to None. Its works for me**.
    form.instance.fecha_real_termino = None
    form.instance.fecha_real_termino = None
    form.instance.fecha_real_termino = None


    if form.is_valid():

        if self.request.session['id_orden'] == 2:
            id_objetivo = Ges_Objetivo_Tactico.objects.get(id=self.request.session['id_objetivo'])
            form.instance.id_objetivo_tactico = id_objetivo

        if self.request.session['id_orden'] == 3:
            id_objetivo = Ges_Objetivo_TacticoTN.objects.get(id=self.request.session['id_objetivo'])
            form.instance.id_objetivo_tacticotn = id_objetivo

        if self.request.session['id_orden'] == 4:
            id_objetivo = Ges_Objetivo_Operativo.objects.get(id=self.request.session['id_objetivo'])
            form.instance.id_objetivo_operativo = id_objetivo

        form.save()
        request.session['message_class'] = "alert alert-success"
        messages.success(self.request, "Los datos fueron actualizados correctamente!")
        return HttpResponseRedirect('/actividades/detalle/' + str(self.request.session['id_objetivo']))
    else:
        request.session['message_class'] = "alert alert-danger"
        messages.error(self.request,
                       "Error interno: No se ha creado el registro. Comuníquese con el administrador.")
        return HttpResponseRedirect('/actividades/detalle/' + str(self.request.session['id_objetivo']))

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多